Подтвердить что ты не робот

Почему моя служба WCF дает сообщение "не имеет привязки с None MessageVersion"?

Я создал рабочую службу WCF. Теперь я хочу добавить некоторую безопасность для фильтрации адресов Ip. Я последовал примеру, который microsoft публикует в образцах, чтобы попытаться добавить IDispatchMessageInspector, который вызовет вызов AfterReceiveRequest, а затем выкинет ошибку, если ip-адрес не из разрешенного списка.

После просмотра кода; они настроили его с помощью "wsHttpBinding", однако я хочу использовать "webHttpBinding" или "basicHttpBinding". Но когда я его установил, я получаю сообщение об ошибке:

Конечная точка на 'http://upload/api/Api.svc/soap' не имеет Связывание с None MessageVersion. 'System.ServiceModel.Description.WebHttpBehavior' предназначен только для использовать с WebHttpBinding или аналогичными привязками.

Моя конфигурация:

<system.serviceModel>


    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
    <!--Set up the service-->
    <services>
      <service behaviorConfiguration="SOAPRESTDemoBehavior" name="HmlApi">
        <endpoint address="rest" binding="webHttpBinding" contract="VLSCore2.Interfaces.IHmlApi" behaviorConfiguration="SOAPRESTDemoEndpointBehavior" />
        <endpoint address="soap" binding="basicHttpBinding" contract="VLSCore2.Interfaces.IHmlApi" behaviorConfiguration="SOAPRESTDemoEndpointBehavior" />
      </service>
    </services>

    <!--Define the behaviours-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="SOAPRESTDemoBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>

      <!---Endpoint -->
      <endpointBehaviors>
        <behavior name="SOAPRESTDemoEndpointBehavior">
          <ipFilter/>
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <extensions>
      <behaviorExtensions>
        <add name="ipFilter" type="VLSCore2.Api.IpFilterBehaviourExtensionElement, VLSCore2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
      </behaviorExtensions>
    </extensions>

  </system.serviceModel>

Так что мне интересно, как я могу настроить своего инспектора сообщений без использования WebHttpBinding. Возможно ли это?

Я хочу использовать SOAP 'basicHttpBinding', а не wsHttpBinding (и все WS *) связанные с этим накладные расходы....

4b9b3361

Ответ 1

Это происходит просто потому, что вы настроили одно конечное оконечное устройство для конечных точек SOAP и REST, но конечная точка SOAP не может иметь поведение webHttp. Вам нужно разделить их так, чтобы они были:

  <endpointBehaviors>
    <behavior name="SOAPDemoEndpointBehavior">
      <ipFilter/>
    </behavior>
    <behavior name="RESTDemoEndpointBehavior">
      <ipFilter/>
      <webHttp />
    </behavior>
  </endpointBehaviors>

а затем ваши конечные точки должны быть:

    <endpoint address="rest" binding="webHttpBinding" contract="VLSCore2.Interfaces.IHmlApi" behaviorConfiguration="RESTDemoEndpointBehavior" />
    <endpoint address="soap" binding="basicHttpBinding" contract="VLSCore2.Interfaces.IHmlApi" behaviorConfiguration="SOAPDemoEndpointBehavior" />