WCF SOAP 1.2-Dienst erwartet den Inhaltstyp SOAP 1.1

Ich erstelle einen WCF-Webdienst, für den eine Interaktion mit Nicht-WCF-Clients erforderlich ist (in der Tat gibt es keine WCF-Clients).

Ich habe bereits eine WSDL mit SOAP 1.2 geschrieben (wie in diesem Beispiel). Ich habe die WSDL validiert und diese Datei (nicht die von WCF generierte WSDL, die sich oberflächlich unterscheidet) verwendet, um eine zu erstellensoapUI Testprojekt.

Ich habe eine Anforderung, dass der Webdienst SOAP 1.2 unterstützt, daher kann ich nicht einfach auf SOAP 1.1 zurückgreifen (was in einem frühen Prototyp gut funktioniert hat).

Ich habe benutztWSCF.blue zum Generieren meiner WCF-Dienst-, Schnittstellen- und Datenvertragsklassen. Alles wird gut kompiliert und der Endpunkt wird angezeigt, wenn ich den WCF-Dienst in meinem Browser drücke. Alles scheint gut mit der Welt.

Wenn ich versuche, eine Methode von soapUi aufzurufen, erhalte ich vom Server die folgende Antwort (wie von soapUI angezeigt):

<code>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
</code>

(Tatsächliche Methodennamen und Namespaces wurden für die Zwecke dieser Frage manuell geändert. Tippfehler im Namespace sind keine Fehler in meinem Code - nur ein Versehen beim Eingeben dieser Frage.)

Ich weiß, dass SOAP 1.1 angibt, dass der Inhaltstyp sein musstext / xml. SOAP 1.2 erfordertAnwendung / Seife + xml.

Meine rohe Anfrage (gemäß soapUI):

<code>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>
</code>

Aus dieser Antwort geht hervor, dass meine Anforderung ordnungsgemäß erstellt wurde - es handelt sich um eine SOAP 1.2-Anforderung mit dem richtigen Inhaltstyp. Mein WCF-Dienst erwartet diesen Inhaltstyp jedoch nicht. Ich gehe davon aus, dass ich ihn nicht richtig konfiguriert habe und er denkt, dass es sich um einen SOAP 1.1-Webdienst handelt.

Minimale Web.config, wie prodieser Blogbeitrag:

<code><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>
</code>

Ein Ausschnitt aus dem Servicevertrag:

<code>[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);
}
</code>

Ich habe die Dienstablaufverfolgung für meinen WCF-Dienst aktiviert und sehe die folgende Ausnahme, die meine Hypothese zu bestätigen scheint:

<code>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>
</code>

Daher stimmen meine Vertrags- und Servicebindungen wahrscheinlich nicht überein, wenn diese Meldung angenommen wird, aber nach meinem Verständnis von WCF ist meine Konfiguration (oder zumindest die dahinter stehende Absicht) korrekt.

Hat jemand eine Idee, was mit meiner Konfiguration nicht stimmt?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage