0
我試圖確保在通過WCF序列化時保留我的對象引用,但從未調用我的覆蓋範圍上的CreateSerializer
。有人能幫我解決這個問題嗎?在WCF中保留對象引用的問題
這是我的代碼:
定製DataContractSerializerOperationBehavior:
public class ObjectGraphDataContractSerializerBehavior : DataContractSerializerOperationBehavior
{
/// <summary>
/// Initializes a new instance of the <see cref="ObjectGraphDataContractSerializerBehavior"/> class.
/// </summary>
/// <param name="operationDescription">The operation description.</param>
public ObjectGraphDataContractSerializerBehavior(OperationDescription operationDescription)
: base(operationDescription)
{
}
public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
{
return new DataContractSerializer(type, name, ns, knownTypes,
int.MaxValue /*maxItemsInObjectGraph*/,
false/*ignoreExtensionDataObject*/,
true/*preserveObjectReferences*/,
null/*dataContractSurrogate*/);
}
public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
{
return new DataContractSerializer(type, name, ns, knownTypes,
int.MaxValue /*maxItemsInObjectGraph*/,
false/*ignoreExtensionDataObject*/,
true/*preserveObjectReferences*/,
null/*dataContractSurrogate*/);
}
public static void SetDataContractSerializerBehavior(ContractDescription contractDescription)
{
foreach (OperationDescription operation in contractDescription.Operations)
{
operation.Behaviors.Add(new ObjectGraphDataContractSerializerBehavior(operation));
}
}
}
啓動服務主機:
var serviceHost = new ServiceHost(typeof (Service));
serviceHost.AddServiceEndpoint(typeof (IService), new NetTcpBinding(), DummyUrl);
foreach (var endpoint in serviceHost.Description.Endpoints)
ObjectGraphDataContractSerializerBehavior.SetDataContractSerializerBehavior(endpoint.Contract);
serviceHost.Open();
創建通道:
m_ChannelFactory = new ChannelFactory<IService>(m_Binding, new EndpointAddress(m_Url));
ObjectGraphDataContractSerializerBehavior.SetDataContractSerializerBehavior(m_ChannelFactory.Endpoint.Contract);
foreach (var behavior in endpointBehaviors)
m_ChannelFactory.Endpoint.Behaviors.Add(behavior);
我不相信它正在工作,因爲我從來沒有到過CreateSerializer中的斷點。但它的工作。 – Michael