2012-05-01 50 views
21

Estoy construyendo un servicio web WCF que requiere interoperabilidad con clientes que no son WCF (de hecho, no habrá clientes WCF).Servicio WCF SOAP 1.2 esperando contenido SOAP 1.1 tipo

Ya he escrito un WSDL usando SOAP 1.2 (as per this example). He validado el WSDL y he usado este archivo (no el WSDL generado por WCF, que es superficialmente diferente) para crear un proyecto de prueba soapUI.

Tengo el requisito de que el servicio web sea compatible con SOAP 1.2, por lo que no puedo recurrir a SOAP 1.1 (que funcionó bien en un prototipo inicial).

He usado WSCF.blue para generar mi servicio WCF, interfaz y clases de contrato de datos. Todo se compila muy bien y el punto final queda expuesto si presiono el servicio WCF en mi navegador. Todo parece estar bien con el mundo.

Cuando trato de llamar a un método de soapUI Me da la siguiente respuesta del servidor (como visible desde soapUI):

HTTP/1.1 415 Cannot process the message because the content type 
'application/soap+xml;charset=UTF-8;action="http://tempuri.org/FetchMyThing"' 
was not the expected type 'text/xml; charset=utf-8'. 
Server: Microsoft-IIS/7.5 
X-Powered-By: ASP.NET 
Date: Mon, 30 Apr 2012 08:15:29 GMT 
Content-Length: 0 

(nombres método real y espacios de nombres se han cambiado de forma manual para los fines del presente pregunta. Cualquier error tipográfico en el espacio de nombres no son errores en mi código, solo un descuido al escribir esta pregunta)

Sé que SOAP 1.1 especifica que el tipo de contenido debe ser text/xml. SOAP 1.2 requiere application/soap + xml.

Mi solicitud de prima (según soapUI):

POST http://localhost/MyWs.svc HTTP/1.1 
Accept-Encoding: gzip,deflate 
Content-Type: application/soap+xml;charset=UTF-8;action="http://tempuri.org/FetchMyThing" 

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
       xmlns:ns="http://tempuri.org"> 
    <soap:Header/> 
    <soap:Body> 
     <ns:fetchMyThingRequest attribute1="1" attribute2="10"> 
     </ns:fetchMyThingRequest> 
    </soap:Body> 
</soap:Envelope> 

De esta respuesta, me dice que mi solicitud se forma adecuadamente - es una petición SOAP 1.2 con el tipo de contenido correcto. Mi servicio WCF, sin embargo, no espera este tipo de contenido, lo cual supongo que significa que no lo he configurado correctamente y todavía cree que es un servicio web SOAP 1.1.

Web.config mínimo, según this blog post:

<system.serviceModel> 
    <services> 
    <service name="MyNamespace.MyPort"> 
     <endpoint address="" binding="customBinding" bindingConfiguration="httpSoap12" contract="IWsPort12" /> 
    </service> 
    </services> 

    <bindings> 
    <customBinding> 
     <binding name="httpSoap12"> 
     <textMessageEncoding messageVersion="Soap12" /> 
     <httpTransport /> 
     </binding> 
    </customBinding> 
    </bindings> 
</system.serviceModel> 

Un fragmento del contrato de servicios:

[ServiceContract(Namespace = "http://tempuri.org")] 
public interface IWsPort 
{ 
    [OperationContract(Action = "http://tempuri.org/FetchMyThing")] 
    [FaultContract(typeof(WsFault), Action = "http://tempuri.org/FetchMyThing", Name = "fetchMyThingFault")] 
    [XmlSerializerFormat(SupportFaults = true)] 
    FetchMyThingResponse FetchMyThing(FetchMyThingRequest request); 
} 

Habilité servicio de búsqueda para mi servicio WCF y ver la siguiente excepción que parece confirmar mi hipótesis:

Activity: Listen at 'http://mycomputer/MyWs.svc 
<Exception> 
    <ExceptionType>System.ServiceModel.ProtocolException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> 
    <Message>Content Type application/soap+xml;charset=UTF-8;action="http://tempuri.org/FetchMyThing" was sent to a service expecting text/xml; charset=utf-8. The client and service bindings may be mismatched. 
    </Message> 
(erroneous detail snipped) 
</Exception> 

Entonces, mi contrato y ser los enlaces de vicio probablemente no coincidan, si se cree este mensaje, pero por lo que entiendo de WCF, mi configuración (o al menos la intención detrás de esto) es correcta.

¿Alguien tiene alguna idea sobre qué hay de malo en mi configuración?

Respuesta

9

Lo único que puedo pensar es que, debido a que no ha especificado un enlace con muchos detalles, y está usando HTTP (según esto: "Escuche en 'http://mycomputer/MyWs.svc'"), ¿está utilizando el predeterminado (es decir, basicHttpBinding) para esto, ¿cuál está creando la discrepancia?

+3

Sí HTTP y HTTPS! Esto terminó siendo el problema: una falta de coincidencia en el atributo de nombre especificado en mi archivo .svc (el marcado) y el nombre del servicio en mi web.config. Estaba viendo excepciones en el tiempo de ejecución porque mi configuración a veces no era válida, ¡pero eso no significaba que estuviera siendo asignada a la configuración! –

1

Tuve el mismo problema cuando tenía varios enlaces en mi servicio. Cuando eliminé todas las vinculaciones y solo dejé un enlace sin nombre en su lugar, el mensaje de error desapareció.

0

Consulte este enlace How to: Configure WCF Service to Interoperate with ASP.NET Web Service Clients .

Para configurar un servicio de punto final de Windows Communication Foundation (WCF) para interoperar con clientes de servicios Web ASP.NET, utilice el System.ServiceModel. BasicHttpBinding escriba como el tipo de enlace para su punto final de servicio .

Además, la definición de dos puntos finales se pueden utilizar versiones de un mismo servicio

Cuestiones relacionadas