2015-12-30 2 views
0

Я пытаюсь использовать DataContractResolver в качестве альтернативы KnownTypes в WCF.DataContractSerializerOperationBehavior не найден при попытке использовать DataContractResolver

У меня есть следующий код, и я использовал его раньше на стороне сервера. Но на стороне клиента код возвращает null при попытке найти DataContractSerializerOperationBehavior в коллекции поведения операций.

public override IMyService CreateProxy(Uri url) 
{ 
    ServiceEndpoint endpoint = CreateEndpoint(url); 
    var channelFactory = new ChannelFactory<IMyService>(endpoint); 
    InjectResolver(channelFactory.Endpoint); 
    return channelFactory.CreateChannel(); 
} 

private void InjectResolver(ServiceEndpoint endpoint) 
{ 
    foreach (OperationDescription operation in endpoint.Contract.Operations) 
    { 
     var behavior = operation.Behaviors.Find<DataContractSerializerOperationBehavior>(); 
     behavior.DataContractResolver = new DerivedTypeResolver(); // behavior is null here! 
    } 
} 

Почему поведение отсутствует?

UPDATE: Я выяснил, что реальная проблема заключается в том, что WCF использовал XmlSerializer вместо DataContractSerializer. Есть ли способ заставить DataContractSerializer вместо этого? Использует ли WCF сериализатор на основе wsdl? Учитывая, что у меня пока нет возможности изменить серверную часть, каков мой вариант? Поведение XmlSerializer, похоже, не похоже на вариант разрешения самого типа.

ответ

2

Смотрите здесь, например, о том, как создать DataContractSerializerOperationBehavior, если он не существует:

private void DataContractBehavior() 
{ 
    WSHttpBinding b = new WSHttpBinding(SecurityMode.Message); 
    Uri baseAddress = new Uri("http://localhost:1066/calculator"); 
    ServiceHost sh = new ServiceHost(typeof(Calculator), baseAddress); 
    sh.AddServiceEndpoint(typeof(ICalculator), b, ""); 

    // Find the ContractDescription of the operation to find. 
    ContractDescription cd = sh.Description.Endpoints[0].Contract; 
    OperationDescription myOperationDescription = cd.Operations.Find("Add"); 

    // Find the serializer behavior. 
    DataContractSerializerOperationBehavior serializerBehavior = 
     myOperationDescription.Behaviors. 
      Find<DataContractSerializerOperationBehavior>(); 

    // If the serializer is not found, create one and add it. 
    if (serializerBehavior == null) 
    { 
     serializerBehavior = new DataContractSerializerOperationBehavior(myOperationDescription); 
     myOperationDescription.Behaviors.Add(serializerBehavior); 
    } 

    // Change the settings of the behavior. 
    serializerBehavior.MaxItemsInObjectGraph = 10000; 
    serializerBehavior.IgnoreExtensionDataObject = true; 

    sh.Open(); 
    Console.WriteLine("Listening"); 
    Console.ReadLine(); 
} 

пример из https://msdn.microsoft.com/en-us/library/system.servicemodel.description.datacontractserializeroperationbehavior.aspx

+0

Спасибо за пример. Я попытался добавить его сам, но я узнал, что реальная проблема заключалась в том, что WCF использовал XmlSerializer вместо DataContractSerializer - вероятно, поэтому поведение не было найдено. –

+0

Это может помочь вам http://web.archive.org/web/20130430190551/http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in -wcf / –

Смежные вопросы