Je crée un service Web WCF qui nécessite une interopérabilité avec des clients autres que WCF (en fait, il n'y aura pas de clients WCF).
J'ai déjà écrit un WSDL avec SOAP 1.2 ( comme dans cet exemple ). J'ai validé le WSDL et ai utilisé ce fichier (et non le WSDL généré par WCF, qui est superficiellement différent) pour créer un projet soapUI test.
Le service Web doit prendre en charge SOAP 1.2. Par conséquent, je ne peux pas me contenter de revenir à SOAP 1.1 (qui fonctionnait parfaitement dans un prototype précédent).
J'ai utilisé WSCF.blue pour générer mes classes de service, d'interface et de contrat de données WCF. Tout se compile bien et le noeud final est exposé si je clique sur le service WCF dans mon navigateur. Tout semble bien avec le monde.
Lorsque j'essaie d'appeler une méthode à partir de soapUi, je reçois la réponse suivante du serveur (visible de 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
(Les noms de méthode et les espaces de noms réels ont été modifiés manuellement pour les besoins de cette question. Les fautes de frappe dans l'espace de noms ne sont pas des erreurs dans mon code, c'est simplement un oubli de la saisie de cette question.)
Je sais que SOAP 1.1 spécifie que le type de contenu doit être text/xml. SOAP 1.2 nécessite application/soap + xml.
Ma demande brute (selon 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>
A partir de cette réponse, il me dit que ma requête est correctement formée. Il s'agit d'une requête SOAP 1.2 avec le type de contenu correct. Mon service WCF, cependant, ne s'attend pas à ce type de contenu, ce qui, je suppose, signifie que je ne l'ai pas configuré correctement et qu'il pense toujours qu'il s'agit d'un service Web SOAP 1.1.
Web.config minimal, selon cet article de blog :
<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 extrait du contrat de service:
[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);
}
J'ai activé le suivi de service pour mon service WCF et je vois l'exception suivante qui semble confirmer mon hypothèse:
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>
Donc, mon contrat et mes liaisons de service sont probablement incompatibles, si ce message est à croire, mais d'après ce que je comprends de WCF, ma configuration (ou du moins l'intention qui la sous-tend) est correcte.
Quelqu'un a-t-il une idée de ce qui ne va pas dans ma configuration?
La seule chose à laquelle je peux penser, c’est que, parce que vous n’avez pas spécifié de liaison dans beaucoup de détails, et qu’elle utilise HTTP (comme suit: "Listen at ' http: //mycomputer/MyWs.svc '") utilise-t-il alors la valeur par défaut (c'est-à-dire basicHttpBinding
), ce qui crée l'incompatibilité?
J'ai eu le même problème quand j'ai eu plusieurs liaisons sur mon service. Lorsque j'ai supprimé toutes les liaisons et qu'il ne restait qu'une liaison non nommée en place, le message d'erreur a disparu.
Vérifiez ce lien Comment: configurer le service WCF pour qu'il interagisse avec les clients du service Web ASP.NET .
Pour configurer un point de terminaison du service Windows Communication Foundation (WCF) pour être interopérable avec les clients du service Web ASP.NET, utilisez le fichier System.ServiceModel .BasicHttpBinding type comme type de liaison pour votre point de terminaison de service.
En outre, en définissant deux systèmes d'extrémité, vous pouvez utiliser les versions HTTP et HTTPS du même service.