Пользовательский сериализатор WCF не работает - PullRequest
0 голосов
/ 23 июня 2011

Хотите заменить сериализатор wcf на собственный. После поиска в Google я нашел примеры. Но это не работает. Вот мой код: Substitutor:

    internal class MySerializerSubstitutor : DataContractSerializerOperationBehavior
    {
        private static readonly MySerializer _serializer = new MySerializer();
        public MySerializerSubstitutor (OperationDescription operationDescription)
            : base(operationDescription)
        {

        }

        public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
        {
            return _serializer; //NEVER CALLED
        }

        public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
        {
            return _serializer; // NEVER CALLED
        }
    }

Поведение, которое заменяет сериализатор

public class MySerializerBehavior : IOperationBehavior
{

.......

public void ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch)
    {
        var dcs = description.Behaviors.Find<DataContractSerializerOperationBehavior>();

        if (dcs != null)
            description.Behaviors.Remove(dcs);

        description.Behaviors.Add(new MySerializerSubstitutor(description)); //works fine
    }

.............

}

И хост:

protected override void ApplyConfiguration()
{
var behavior = new MySerializerBehavior()
                foreach (var op in Description.Endpoints.SelectMany(ep => ep.Contract.Operations))
                {
                    op.Behaviors.Add(behavior);
                }
}

Что не так с этим кодом?

1 Ответ

2 голосов
/ 23 июня 2011

Одна проблема, которая сразу видна, это то, что вы не можете заменить поведение на поведение. По данным MSDN:

Все методы IOperationBehavior передают OperationDescription объект как параметр. Этот параметр только для проверки; если ты изменить объект OperationDescription, поведение выполнения не определено.

http://msdn.microsoft.com/en-us/library/system.servicemodel.description.ioperationbehavior.aspx

Я не уверен на 100%, что вы пытаетесь выполнить, но вот пример, который изменяет свойства поведения сериализатора.

http://msdn.microsoft.com/en-us/library/system.servicemodel.description.datacontractserializeroperationbehavior.aspx

Если вам нужно больше настроек, чем предоставляют свойства, вы можете попробовать заменить DataContractSerializerOperationBehavior. РЕДАКТИРОВАТЬ: Просто убедитесь, что вы добавляете его перед вызовом Open. См. Эту статью для добавления нового поведения http://msdn.microsoft.com/en-us/library/ms730137.aspx

...