e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
199 lines
8.0 KiB
C#
199 lines
8.0 KiB
C#
//-----------------------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
namespace System.ServiceModel.Description
|
|
{
|
|
using System;
|
|
using System.ServiceModel.Channels;
|
|
using System.ServiceModel.Dispatcher;
|
|
using System.IO;
|
|
using System.ServiceModel;
|
|
using System.Runtime.Serialization;
|
|
using System.Collections.Generic;
|
|
using System.Xml;
|
|
|
|
public class DataContractSerializerOperationBehavior : IOperationBehavior, IWsdlExportExtension
|
|
{
|
|
readonly bool builtInOperationBehavior;
|
|
|
|
OperationDescription operation;
|
|
DataContractFormatAttribute dataContractFormatAttribute;
|
|
internal bool ignoreExtensionDataObject = DataContractSerializerDefaults.IgnoreExtensionDataObject;
|
|
bool ignoreExtensionDataObjectSetExplicit;
|
|
internal int maxItemsInObjectGraph = DataContractSerializerDefaults.MaxItemsInObjectGraph;
|
|
bool maxItemsInObjectGraphSetExplicit;
|
|
IDataContractSurrogate dataContractSurrogate;
|
|
DataContractResolver dataContractResolver;
|
|
|
|
public DataContractFormatAttribute DataContractFormatAttribute
|
|
{
|
|
get { return this.dataContractFormatAttribute; }
|
|
}
|
|
|
|
public DataContractSerializerOperationBehavior(OperationDescription operation)
|
|
: this(operation, null)
|
|
{
|
|
}
|
|
|
|
public DataContractSerializerOperationBehavior(OperationDescription operation, DataContractFormatAttribute dataContractFormatAttribute)
|
|
{
|
|
this.dataContractFormatAttribute = dataContractFormatAttribute ?? new DataContractFormatAttribute();
|
|
this.operation = operation;
|
|
}
|
|
|
|
internal DataContractSerializerOperationBehavior(OperationDescription operation,
|
|
DataContractFormatAttribute dataContractFormatAttribute, bool builtInOperationBehavior)
|
|
: this(operation, dataContractFormatAttribute)
|
|
{
|
|
this.builtInOperationBehavior = builtInOperationBehavior;
|
|
}
|
|
|
|
internal bool IsBuiltInOperationBehavior
|
|
{
|
|
get { return this.builtInOperationBehavior; }
|
|
}
|
|
|
|
public int MaxItemsInObjectGraph
|
|
{
|
|
get { return maxItemsInObjectGraph; }
|
|
set
|
|
{
|
|
maxItemsInObjectGraph = value;
|
|
maxItemsInObjectGraphSetExplicit = true;
|
|
}
|
|
}
|
|
|
|
internal bool MaxItemsInObjectGraphSetExplicit
|
|
{
|
|
get { return maxItemsInObjectGraphSetExplicit; }
|
|
set { maxItemsInObjectGraphSetExplicit = value; }
|
|
}
|
|
|
|
public bool IgnoreExtensionDataObject
|
|
{
|
|
get { return ignoreExtensionDataObject; }
|
|
set
|
|
{
|
|
ignoreExtensionDataObject = value;
|
|
ignoreExtensionDataObjectSetExplicit = true;
|
|
}
|
|
}
|
|
|
|
internal bool IgnoreExtensionDataObjectSetExplicit
|
|
{
|
|
get { return ignoreExtensionDataObjectSetExplicit; }
|
|
set { ignoreExtensionDataObjectSetExplicit = value; }
|
|
}
|
|
|
|
public IDataContractSurrogate DataContractSurrogate
|
|
{
|
|
get { return dataContractSurrogate; }
|
|
set { dataContractSurrogate = value; }
|
|
}
|
|
|
|
public DataContractResolver DataContractResolver
|
|
{
|
|
get { return dataContractResolver; }
|
|
set { dataContractResolver = value; }
|
|
}
|
|
|
|
public virtual XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
|
|
{
|
|
return new DataContractSerializer(type, name, ns, knownTypes, MaxItemsInObjectGraph, IgnoreExtensionDataObject, false /*preserveObjectReferences*/, DataContractSurrogate, DataContractResolver);
|
|
}
|
|
|
|
public virtual XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
|
|
{
|
|
return new DataContractSerializer(type, name, ns, knownTypes, MaxItemsInObjectGraph, IgnoreExtensionDataObject, false /*preserveObjectReferences*/, DataContractSurrogate, DataContractResolver);
|
|
}
|
|
|
|
internal object GetFormatter(OperationDescription operation, out bool formatRequest, out bool formatReply, bool isProxy)
|
|
{
|
|
MessageDescription request = operation.Messages[0];
|
|
MessageDescription response = null;
|
|
if (operation.Messages.Count == 2)
|
|
response = operation.Messages[1];
|
|
|
|
formatRequest = (request != null) && !request.IsUntypedMessage;
|
|
formatReply = (response != null) && !response.IsUntypedMessage;
|
|
|
|
if (formatRequest || formatReply)
|
|
{
|
|
if (PrimitiveOperationFormatter.IsContractSupported(operation))
|
|
return new PrimitiveOperationFormatter(operation, dataContractFormatAttribute.Style == OperationFormatStyle.Rpc);
|
|
else
|
|
return new DataContractSerializerOperationFormatter(operation, dataContractFormatAttribute, this);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
|
|
void IOperationBehavior.Validate(OperationDescription description)
|
|
{
|
|
}
|
|
|
|
void IOperationBehavior.AddBindingParameters(OperationDescription description, BindingParameterCollection parameters)
|
|
{
|
|
}
|
|
|
|
void IOperationBehavior.ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch)
|
|
{
|
|
if (description == null)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("description");
|
|
|
|
if (dispatch == null)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("dispatch");
|
|
|
|
if (dispatch.Formatter != null)
|
|
return;
|
|
|
|
bool formatRequest;
|
|
bool formatReply;
|
|
dispatch.Formatter = (IDispatchMessageFormatter)GetFormatter(description, out formatRequest, out formatReply, false);
|
|
dispatch.DeserializeRequest = formatRequest;
|
|
dispatch.SerializeReply = formatReply;
|
|
}
|
|
|
|
void IOperationBehavior.ApplyClientBehavior(OperationDescription description, ClientOperation proxy)
|
|
{
|
|
if (description == null)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("description");
|
|
|
|
if (proxy == null)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("proxy");
|
|
|
|
if (proxy.Formatter != null)
|
|
return;
|
|
|
|
bool formatRequest;
|
|
bool formatReply;
|
|
proxy.Formatter = (IClientMessageFormatter)GetFormatter(description, out formatRequest, out formatReply, true);
|
|
proxy.SerializeRequest = formatRequest;
|
|
proxy.DeserializeReply = formatReply;
|
|
}
|
|
|
|
void IWsdlExportExtension.ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext endpointContext)
|
|
{
|
|
if (exporter == null)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("exporter");
|
|
if (endpointContext == null)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("endpointContext");
|
|
|
|
MessageContractExporter.ExportMessageBinding(exporter, endpointContext, typeof(DataContractSerializerMessageContractExporter), this.operation);
|
|
}
|
|
|
|
void IWsdlExportExtension.ExportContract(WsdlExporter exporter, WsdlContractConversionContext contractContext)
|
|
{
|
|
if (exporter == null)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("exporter");
|
|
if (contractContext == null)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("contractContext");
|
|
|
|
new DataContractSerializerMessageContractExporter(exporter, contractContext, this.operation, this).ExportMessageContract();
|
|
}
|
|
|
|
}
|
|
}
|