Serviço WCF SOAP 1.2 esperando o tipo de conteúdo SOAP 1.1

Eu estou construindo um serviço da web WCF que requer interoperabilidade com clientes não-WCF (na verdade, não haverá clientes WCF).

Eu já escrevi um WSDL usando o SOAP 1.2 (como por este exemplo). Eu validei o WSDL e usei este arquivo (não o WSDL gerado pelo WCF, que é superficialmente diferente) para criar umsoapUI projeto de teste.

Eu tenho um requisito de que o serviço da web suportará o SOAP 1.2, portanto, não posso simplesmente voltar ao SOAP 1.1 (que funcionou muito bem em um protótipo inicial).

Eu useiWSCF.blue para gerar minhas classes de serviço, interface e contrato de dados do WCF. Tudo compila bem e o endpoint fica exposto se eu acertar o serviço WCF no meu navegador. Tudo parece bem com o mundo.

Quando eu tento chamar um método de soapUi recebo a seguinte resposta do servidor (como visível de 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>

(Os nomes dos métodos e namespaces reais foram alterados manualmente para os propósitos desta questão. Quaisquer erros de digitação no namespace não são erros no meu código - apenas um descuido em digitar esta questão)

Eu sei que o SOAP 1.1 especifica que o tipo de conteúdo deve sertexto / xml. SOAP 1.2 requeraplicação / soap + xml.

Meu pedido bruto (conforme 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>

A partir dessa resposta, ele informa que minha solicitação foi formada corretamente - é uma solicitação SOAP 1.2 com o tipo de conteúdo correto. Meu serviço WCF, no entanto, não espera esse tipo de conteúdo, o que eu suponho significa que não o configurei corretamente e ainda acha que é um serviço da Web SOAP 1.1.

Web.config mínimo, conformeeste post de blog:

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

Um fragmento do contrato de serviço:

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

Eu habilitei o rastreamento de serviço para meu serviço WCF e vejo a seguinte exceção que parece confirmar minha hipótese:

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

Portanto, minhas ligações de contrato e de serviço provavelmente são incompatíveis, se esta mensagem for considerada, mas pelo que entendi do WCF minha configuração (ou pelo menos a intenção por trás dela) está correta.

Alguém tem alguma idéia do que há de errado com minha configuração?

questionAnswers(3)

yourAnswerToTheQuestion