Конфигурация поведения конечной точки WCF с Protobuf-net

У меня есть служба WCF (.NET 4), которая предоставляет 4 конечные точки, одна из которых настроена с расширением поведения protobuf-net (V1.0.0.280). Однако я заметил, что поведение protobuf-net срабатывает для ВСЕХ определенных конечных точек, включая те, для которых protbuf-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>

person Japps    schedule 12.08.2011    source источник
comment
У нас та же проблема с прото-поведением, добавленным программно.   -  person Ruslan    schedule 12.03.2014


Ответы (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. Это... сбивает с толку.

person Marc Gravell    schedule 12.08.2011
comment
Большое спасибо за ваш супер быстрый ответ, и я понимаю вашу точку зрения. Я заметил кое-что действительно странное, играя с этим, а именно: если я сохраняю конечную точку с поведением protobuf в качестве последнего узла в конфигурации, тогда все работает нормально, как и ожидалось. протобуф. Если я перемещу его между ними, то конечные точки будут определены после того, как он подберет protobuf !! Буду копать глубже и отпишусь, если найду первопричину - person Japps; 12.08.2011
comment
Как я понял, contractDescription действительно используется между конечными точками. Но я не понимаю, почему прото-поведение добавляется только к конечным точкам, определенным после конечной точки с прото-поведением (включая конечную точку, для которой поведение настроено явно). Мы используем то же решение, что и @Japps: добавляем конечную точку с прототипом в качестве последней конечной точки на хост. - person Ruslan; 12.03.2014