Sto costruendo un servizio Web WCF che richiede l'interoperabilità con client non WCF (infatti, non ci saranno client WCF).WCF SOAP 1.2 servizio in attesa di tipo di contenuto SOAP 1.1
Ho già scritto un WSDL utilizzando SOAP 1.2 (as per this example). Ho convalidato il WSDL e ho usato questo file (non il WSDL generato da WCF, che è superficialmente diverso) per creare un progetto di prova soapUI.
Ho il requisito che il servizio Web supporterà SOAP 1.2, quindi non posso semplicemente tornare a SOAP 1.1 (che ha funzionato bene in un prototipo iniziale).
Ho usato WSCF.blue per generare il mio servizio WCF, l'interfaccia e le classi di contratto dati. Tutto si compila bene e l'endpoint è esposto se colpisco il servizio WCF nel mio browser. Tutto sembra bene con il mondo.
Quando provo a chiamare un metodo da SoapUI ottengo la seguente risposta dal server (come visibile da 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
(i nomi dei metodi attuali e gli spazi dei nomi sono stati modificati manualmente ai fini del presente Tutti gli errori di battitura nel namespace non sono errori nel mio codice - solo una svista nella digitazione di questa domanda)
So che SOAP 1.1 specifica che il tipo di contenuto deve essere text/xml. SOAP 1.2 richiede application/soap + xml.
La mia richiesta prima (come da 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>
Da questa risposta, mi dice che la mia richiesta è adeguatamente formata - si tratta di una richiesta di SOAP 1.2 con il tipo di contenuto corretto. Il mio servizio WCF, tuttavia, non si aspetta questo tipo di contenuto, che presumo significa che non l'ho configurato correttamente e continua a pensare che si tratti di un servizio Web SOAP 1.1.
Web.config minimo, come da 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 frammento del contratto di servizio:
[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);
}
ho attivato il servizio di traccia per il mio servizio WCF e vedere la seguente eccezione che sembra confermare la mia ipotesi:
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>
Quindi, il mio contratto e ser i collegamenti vice sono probabilmente non corrispondenti, se questo messaggio è creduto, ma da quello che ho capito di WCF la mia configurazione (o almeno l'intento dietro di esso) è corretta.
Qualcuno ha qualche idea su cosa c'è di sbagliato nella mia configurazione?
Sì! Questo è stato il problema - una mancata corrispondenza nell'attributo name specificato nel mio file .svc (il markup) e il nome del servizio nel mio web.config. Stavo vedendo eccezioni di runtime perché la mia configurazione a volte non era valida, ma questo non significava che fosse effettivamente mappato alla configurazione! –