2012-05-01 10 views
21

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?

risposta

9

L'unica cosa che posso pensare è che, poiché non hai specificato un'associazione in molti dettagli, e il suo utilizzo di HTTP (come per questo: "Ascolta a 'http://mycomputer/MyWs.svc'") allora sta usando il predefinito (es. basicHttpBinding) per questo, che sta creando la mancata corrispondenza?

+3

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

1

Ho avuto lo stesso problema quando avevo più binding sul mio servizio. Quando ho rimosso tutti i binding e lasciato solo un binding senza nome, il messaggio di errore è scomparso.

0

Controllare questo collegamento How to: Configure WCF Service to Interoperate with ASP.NET Web Service Clients .

Per configurare un Windows Communication Foundation (WCF) servizio di endpoint per l'interazione con i clienti dei servizi Web ASP.NET, utilizzare il System.ServiceModel. BasicHttpBinding digitare come tipo di binding per l'endpoint del servizio .

Inoltre, la definizione di due punti finali che è possibile utilizzare le versioni HTTP e HTTPS dello stesso servizio

Problemi correlati