web-dev-qa-db-fra.com

WCF et Soap 1.1

J'essaie de créer un service qu'un tiers devrait, espérons-le, consommer.
Le consommateur est compatible avec SOAP 1.1, c'est pourquoi j'utilise basicHttpBinding pour le serveur. Lorsque la demande réelle est effectuée, il semble que quelque chose ne va pas avec les types de contenu attendus Utilisation de basicHttpBinding Je ne comprends pas pourquoi le serveur attend toujours 'application/soap + xml' qui, à ma connaissance, n'est requis que par SOAP 1.2.

J'ai utilisé WireShark pour savoir exactement sur quoi ces deux-là communiquaient. Voir le flux tcp et la configuration ci-dessous.

Toute aide est appréciée.

Demande d'application tierce

POST/HTTP/1.1

SOAPAction: http://tempuri.org/ITestService/Hello

Type de contenu: texte/xml; jeu de caractères = utf-8

Hébergeur: shdesktop: 8000

Contenu-Longueur: 297

Attendez-vous à: 100-continuer

Connexion: Fermer

Réponse du serveur WCF

HTTP/1.1 415 Impossible de traiter le message car le type de contenu 'text/xml; charset = utf-8 'n'était pas le type attendu' application/soap + xml; jeu de caractères = utf-8 '.

Content-Length: 0

Serveur: Microsoft-HTTPAPI/2.0

Date: mar 09 février 2010 14:03:19 GMT

Connexion: fermer

Configuration du service

<system.serviceModel>
    <services>
      <service behaviorConfiguration="behTestService" name="ConsoleApplication1.TestService">
        <endpoint address="" binding="mexHttpBinding" contract="IMetadataExchange" />
        <endpoint address="TestService" binding="basicHttpBinding"
            contract="ConsoleApplication1.ITestService" />
        <Host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000" />
          </baseAddresses>
        </Host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="behTestService">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
26
Silas Hansen

Le basicHttpBinding utilise SOAP 1.1 - mais dans ce cas, vous auriez un type de contenu de application/soap+xml.

Puisque votre client envoie text/xml - n'importe quelle chance qu'ils attendent une interface REST? Ceci serait géré par la WCF webHttpBinding.

En savoir plus sur REST dans WCF sur le MSDN WCF REST Developer Center ) et consultez la série de screencast Pluralsight sur WCF REST - hautement recommandé!

19
marc_s

Généralement, lorsque nous recevons un message/une erreur dans un service Web qui comprend le texte:

content type 'text/xml'

Cela signifie que le serveur Web a renvoyé une page d'erreur au lieu de la réponse XML attendue.

7
Shiraz Bhaiji

J'ai eu exactement le même problème - la définition disait qu'il s'agissait de soap 1.2 mais attendait 1.1 car le type de contenu était différent.

J'ai constaté que si j'avais ajusté la configuration de mon serveur à partir de:

...
<endpoint address="" .../>
    <Host>
        <baseAddresses>
            <add baseAddress="http://localhost:8001/services/fooService" />
        </baseAddresses>
    </Host>
...

À:

...
<endpoint address="fooService" .../>
    <Host>
        <baseAddresses>
            <add baseAddress="http://localhost:8001/services" />
        </baseAddresses>
    </Host>
...

Le wsdl l'a exposé comme Soap 1.1 cette fois.

3
Julian