1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
|
//-----------------------------------------------------------------------------
// 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();
}
}
}
|