WCF Отправка объекта из MessageInspector в метод операции - PullRequest
0 голосов
/ 26 мая 2020

Я работаю с очень сложной и вложенной веб-службой. Сообщения не всегда десериализуются должным образом во время операции, и поставщик предложил мне использовать MessageInspectors для правильного получения данных. Это работало правильно в течение некоторого времени, но я начинаю видеть проблемы, потому что в MessageInspector я устанавливаю переменную stati c XElement в классе в качестве обходного пути для невозможности передать объект XElement в экземпляр класса, который запускается для этого вызова.

Я немедленно копирую переменную stati c в экземпляр, как только операция вызывается, но у меня возникли проблемы с этим.

Каков правильный способ десериализации SOAP в MessageInspector и передачи его методу операции?

1 Ответ

0 голосов
/ 27 мая 2020

Согласно вашему описанию, вам необходимо сериализовать сообщение SOAP самостоятельно. Messageinspector - это просто перехватчик сообщений, который можно использовать для изменения содержимого сообщения. Сериализация в messageinspector не подходит. Я предлагаю вам использовать DataContractSerializerOperationBehavior. Сериализуйте сообщение SOAP в классе, наследующем DataContractSerializerOperationBehavior.

Вот демонстрация:

    public class NetDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior

{

    public NetDataContractSerializerOperationBehavior(OperationDescription operationDescription)

        : base(operationDescription)

    {

    }

    public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)

    {

        return new NetDataContractSerializer(name, ns);

    }

    public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)

    {

        return new NetDataContractSerializer(name, ns);

    }

}

Это класс, наследующий DataContractSerializerOperationBehavior, в котором вы можете написать свои собственные методы сериализации .

     ServiceHost selfHost = new ServiceHost(typeof(Service1));
        foreach (ServiceEndpoint serviceEndpoint in selfHost.Description.Endpoints)

        {

            foreach (OperationDescription operation in serviceEndpoint.Contract.Operations)

            {
                operation.Behaviors.Remove<DataContractSerializerOperationBehavior>();

                operation.Behaviors.Add(new NetDataContractSerializerOperationBehavior(operation));

            }

        }

Добавьте собственное поведение сериализации к поведению службы и удалите поведение сериализации по умолчанию.

Это ссылка на DataContractSerializerOperationBehavior:

https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.description.datacontractserializeroperationbehavior?view=dotnet-plat-ext-3.1

...