0

我正在使用一个非常复杂且嵌套的 Web 服务。消息并不总是在操作中正确反序列化,供应商建议我使用 MessageInspectors 来正确获取数据。这已经正常工作了一段时间,但我开始看到问题,因为在 MessageInspector 中,我在类中设置了一个静态 XElement 变量作为无法将 XElement 对象传递给实例的解决方法为这个调用开始的类。

调用操作后,我立即将静态变量复制到实例中,但我遇到了问题。

在 MessageInspector 反序列化 SOAP 并将其传递给操作方法的正确方法是什么?

4

1 回答 1

0

根据您的描述,您需要自己序列化 SOAP 消息。Messageinspector 只是一个消息拦截器,可以用来修改消息的内容。messageinspector 中的序列化不合适。我建议您使用 DataContractSerializerOperationBehavior。在继承 DataContractSerializerOperationBehavior 的类中序列化 SOAP 消息。

这是一个演示:

    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

于 2020-05-27T07:48:34.143 回答