2010-02-09 16 views
25

Estoy tratando de crear un servicio que un tercero debería consumir.
El consumidor es compatible con SOAP 1.1, por lo que estoy usando basicHttpBinding para el servidor. Cuando se realiza la solicitud real, algo parece ir mal con los tipos de contenido que espera el servidor. Usando basicHttpBinding no entiendo por qué el servidor aún espera 'application/soap + xml' que, según mi conocimiento, solo es requerido por SOAP 1.2.

He usado wireshark para averiguar exactamente de qué se estaban comunicando esos dos. Ver tcp stream y configurar a continuación.

Cualquier ayuda es apreciada.

WCF and Soap 1.1

tercera aplicación partido solicitud

de POST/HTTP/1.1

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

Content-Type: text/xml; charset = UTF-8

Anfitrión: shdesktop: 8000

Content-Length: 297

esperar: 100-continue

conexion: Cerrar

respuesta WCF servidor

HTTP/1.1 415 No se puede procesar el mensaje porque el tipo de contenido 'text/xml; charset = utf-8 'no era el tipo esperado ' application/soap + xml; charset = utf-8 '.

Content-Length: 0

Servidor: Microsoft-HTTPAPI/2.0

Fecha: mar, 09 de Feb 2010 14:03:19 GMT

Connection: close

Configuración del servicio

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

Respuesta

19

El basicHttpBinding utiliza SOAP 1.1, pero en ese caso, tendría un tipo de contenido application/soap+xml.

Dado que su cliente está enviando text/xml - ¿hay alguna posibilidad de que estén esperando una interfaz REST? Esto sería manejado por WCF webHttpBinding.

Lea más sobre REST en WCF en el MSDN WCF REST Developer Center y eche un vistazo a Pluralsight screencast series on WCF REST - ¡muy recomendable!

+0

oh, SOAP 1.1 usaría 'application/soap + xml'? Voy a probar el webHttpBinding mañana, ¡gracias! Sé con certeza que funciona cuando creo un servicio simple de asmx, si hace alguna diferencia. –

+2

@Silas: los servicios web ASP.NET "antiguos" (ASMX) ** y ** WCF basicHttpBinding utilizan SOAP 1.1, por lo que debería estar bien, realmente. Necesita verificar si su cliente le está enviando una solicitud SOAP, o simplemente tratar de publicar un XML en su URL –

+0

Estaba llamando a http: // en su lugar, necesitaba llamar a http: // /TestService. Estúpido error por mi parte. ¡Gracias por toda la ayuda, de todos modos! –

6

En general, cuando se obtiene un mensaje/error en un servicio web que incluye el texto:

content type 'text/xml' 

Esto significa que el servidor web devuelve una página de error en lugar de la respuesta XML esperado.

3

Tuve exactamente el mismo problema: la definición decía que era soap 1.2 pero esperaba 1.1 porque el tipo de contenido era diferente.

He descubierto que si me ajusté la configuración del servidor de:

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

Para:

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

el WSDL expuesto como SOAP 1.1 en esta ocasión.

Cuestiones relacionadas