web-dev-qa-db-fra.com

Pourquoi mon service WCF donne-t-il le message "n'a pas de liaison avec la MessageVersion"?

J'ai créé un service de travail WCF. Je veux maintenant lui ajouter une sécurité pour filtrer les adresses IP. J'ai suivi l'exemple que Microsoft publie dans les exemples pour essayer d'ajouter un IDispatchMessageInspector qui déclenchera un appel AfterReceiveRequest puis émettra une erreur si l'adresse IP ne figure pas dans la liste des adresses autorisées. 

Après avoir regardé le code; ils l'ont configuré en utilisant 'wsHttpBinding', cependant je veux utiliser 'webHttpBinding' ou 'basicHttpBinding'. Mais quand je le configure, j'obtiens l'erreur:

Le point de terminaison situé sur 'http: //upload/api/Api.svc/soap' n'a pas de Liaison avec la MessageVersion None. 'System.ServiceModel.Description.WebHttpBehavior' est uniquement destiné à utiliser avec WebHttpBinding ou des liaisons similaires.

Ma configuration est:

<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>

Alors, qu'est-ce que je me demande, c'est comment je peux configurer mon inspecteur de message sans utiliser WebHttpBinding. Est-ce seulement possible?

Je souhaite utiliser SOAP 'basicHttpBinding' et non les frais généraux associés à wsHttpBinding (et à tous les WS *) ....

26
Exitos

Cela se produit simplement parce que vous avez configuré un seul endpointBehavior pour les noeuds finaux SOAP et REST, mais le noeud final SOAP ne peut pas avoir le comportement webHttp. Vous devez séparer ces éléments pour qu’ils soient:

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

et alors vos points finaux devraient être:

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

Pour moi, c'était parce que j'avais un 'webHttp' défini comme comportement pour une config SOAP. Seule son absence le résolut ..

1
Jon H