【问题标题】:WCF Sending object from MessageInspector to operation methodWCF将对象从MessageInspector发送到操作方法
【发布时间】:2020-09-13 12:23:12
【问题描述】:

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

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

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

【问题讨论】:

  • 我想我会使用 ConcurrencyMode 来缓解问题。

标签: c# wcf idispatchmessageinspector


【解决方案1】:

根据你的描述,你需要自己序列化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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2016-06-05
    相关资源
    最近更新 更多