Usługa WCF SOAP 1.2 oczekuje typu zawartości SOAP 1.1

Buduję usługę WWW WCF, która wymaga interop z klientami innymi niż WCF (w rzeczywistości nie będzie klientów WCF).

Napisałem już WSDL przy użyciu SOAP 1.2 (jak w tym przykładzie). Sprawdziłem poprawność WSDL i użyłem tego pliku (nie WSDL wygenerowanego przez WCF, który jest powierzchownie inny), aby utworzyćsoapUI projekt testowy.

Mam wymaganie, aby usługa internetowa obsługiwała SOAP 1.2, więc nie mogę po prostu wrócić do SOAP 1.1 (który działał dobrze we wczesnym prototypie).

UżyłemWSCF.blue wygenerować moją usługę WCF, interfejs i klasy kontraktów danych. Wszystko ładnie się kompiluje, a punkt końcowy jest odsłonięty, jeśli trafię na usługę WCF w mojej przeglądarce. Wszystko wydaje się dobrze ze światem.

Kiedy próbuję wywołać metodę z soapUi, otrzymuję następującą odpowiedź z serwera (widoczną z soapUI):

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

(Rzeczywiste nazwy metod i przestrzenie nazw zostały ręcznie zmienione na potrzeby tego pytania. Wszelkie literówki w przestrzeni nazw nie są błędami w moim kodzie - tylko niedopatrzenie w pisaniu tego pytania)

Wiem, że SOAP 1.1 określa, że ​​typ zawartości musi byćtekst / xml. SOAP 1.2 wymagaaplikacja / mydło + xml.

Moja surowa prośba (jak w 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>

Z tej odpowiedzi wynika, że ​​moja prośba została poprawnie utworzona - jest to żądanie SOAP 1.2 z poprawnym typem zawartości. Moja usługa WCF nie oczekuje jednak tego typu treści, co, jak zakładam, oznacza, że ​​nie skonfigurowałem go poprawnie i nadal uważa, że ​​jest to usługa internetowa SOAP 1.1.

Minimal Web.config, wgten wpis na blogu:

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

Fragment umowy o świadczenie usług:

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

Włączono śledzenie usługi dla mojej usługi WCF i zobacz następujący wyjątek, który wydaje się potwierdzać moją hipotezę:

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

Tak więc moje powiązania kontraktów i usług są prawdopodobnie niedopasowane, jeśli wierzę w tę wiadomość, ale z tego co rozumiem w WCF moja konfiguracja (lub przynajmniej zamiar za nią) jest poprawna.

Czy ktoś ma jakieś pomysły, co jest nie tak z moją konfiguracją?

questionAnswers(3)

yourAnswerToTheQuestion