使用Protobuf-net配置WCF的终结点行为

7

我有一个WCF服务(.NET 4),其中暴露了4个端点,其中一个端点配置了protobuf-net(V1.0.0.280)行为扩展。然而,我注意到protobuf-net行为会对所有定义的端点产生影响,包括未配置protobuf-net的端点!我已经在下面粘贴了我的配置。我是否遗漏了什么?任何帮助都将不胜感激..谢谢

    <service name="MyService" behaviorConfiguration="MyServiceBehavior">
    <endpoint address="Http.Basic" binding="basicHttpBinding" bindingConfiguration="Http.Basic.Config" contract="IMyService" behaviorConfiguration="DefaultBehavior" />
    <endpoint address="Http.Binary" binding="customBinding" bindingConfiguration="Http.Binary.Config" contract="IMyService" behaviorConfiguration="DefaultBehavior" />
    <endpoint address="Tcp.Binary" binding="customBinding" bindingConfiguration="Tcp.Binary.Config" contract="IMyService" behaviorConfiguration="DefaultBehavior" />
    <endpoint address="Http.ProtoBuf" binding="basicHttpBinding" bindingConfiguration="Http.Basic.Config" contract="IMyService" behaviorConfiguration="ProtoBufBehavior" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8085/MyService"/>
        <add baseAddress="net.tcp://localhost:8086/MyService"/>
      </baseAddresses>
    </host>
  </service>

  <behaviors>
    <serviceBehaviors>
      <behavior name="MyServiceBehavior">
        <serviceMetadata httpGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
    <endpointBehaviors>
      <behavior name="DefaultBehavior">
        <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      </behavior>
      <behavior name="ProtoBufBehavior">
        <ProtoBufSerialization />
      </behavior>
    </endpointBehaviors>
  </behaviors>

  <bindings>
    <basicHttpBinding>
      <binding name="Http.Basic.Config" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
      </binding>
    </basicHttpBinding>
    <customBinding>
      <binding name="Http.Binary.Config" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00">
        <binaryMessageEncoding />
        <httpTransport allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" />
      </binding>
      <binding name="Tcp.Binary.Config" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00">
        <binaryMessageEncoding />
        <tcpTransport hostNameComparisonMode="StrongWildcard" />
      </binding>
    </customBinding>
  </bindings>

我们在程序中添加proto-behaviour时遇到了相同的问题。 - Ruslan
1个回答

1

这很奇怪,但是(检查代码)我只在由WCF提供的端点内应用更改:

    void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
    {
        ReplaceDataContractSerializerOperationBehavior(endpoint);
    }

    void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
    {
        ReplaceDataContractSerializerOperationBehavior(endpoint);
    }

    private static void ReplaceDataContractSerializerOperationBehavior(ServiceEndpoint serviceEndpoint)
    {
        foreach (OperationDescription operationDescription in serviceEndpoint.Contract.Operations)
        {
            ReplaceDataContractSerializerOperationBehavior(operationDescription);
        }
    }


    private static void ReplaceDataContractSerializerOperationBehavior(OperationDescription description)
    {
        DataContractSerializerOperationBehavior dcsOperationBehavior = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
        if (dcsOperationBehavior != null)
        {
            description.Behaviors.Remove(dcsOperationBehavior);
            description.Behaviors.Add(new ProtoOperationBehavior(description));
        }
    }

例如:给定一个端点(由WCF提供),循环遍历该端点中的每个操作(方法),并将序列化程序从DCS更改为PB。

这引发了一个有趣的可能性,即合同定义(因此操作定义)本身在所有端点之间共享 - 但是我真的不确定。如果这种情况,我认为永远不可能在每个端点上拥有不同的处理器。然而,我不是WCF大师。这很令人困惑。


1
非常感谢您的超快速响应,我确实理解您的观点。在尝试过程中,我注意到了一些非常奇怪的事情,即如果我将具有protobuf行为的端点保留为配置中的最后一个节点,则一切都按预期正常工作。但是,如果我将其移动到第一个位置,则所有端点都会选择protobuf。如果我将其移动到中间,则在其后定义的端点会选择protobuf!!如果我找到根本原因,我会深入挖掘并发布。 - Japps
据我所了解,contractDescription确实在端点之间共享。但我不明白为什么只有在定义proto-behaviour的端点之后才会添加proto-behaviour(包括显式配置行为的端点)。我们使用与@Japps类似的解决方案:将具有proto的端点作为最后一个端点添加到主机中。 - Ruslan
这篇旧帖子是我在搜索这个问题时谷歌提供的第一个链接。但我在客户端上遇到了这种行为。我正在将协议行为以编程方式应用于需要此配置的端点。但是我看到了@Japps提到的相同行为。 - Akhilesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接