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?
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! –