期望SOAP 1.1内容类型的WCF SOAP 1.2服务

时间:2012-05-01 20:21:53

标签: wcf

我正在构建一个需要与非WCF客户端互操作的WCF Web服务(实际上,没有WCF客户端)。

我已经使用SOAP 1.2(as per this example)编写了一个WSDL。我已经验证了WSDL并使用了这个文件(不是由WCF生成的WSDL,表面上有所不同)来创建一个soapUI测试项目。

我要求Web服务支持SOAP 1.2,所以我不能再回到SOAP 1.1(在早期原型中工作得很好)。

我使用WSCF.blue生成我的WCF服务,接口和数据协定类。如果我在浏览器中点击WCF服务,一切都很好地编译并暴露端点。一切似乎与世界很好。

当我尝试从soapUi调用方法时,我从服务器获得以下响应(从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

(出于此问题的目的,已经手动更改了实际的方法名称和命名空间。命名空间中的任何拼写错误都不是我的代码中的错误 - 只是在输入此问题时的疏忽)

我知道SOAP 1.1指定内容类型必须是 text / xml 。 SOAP 1.2需要 application / soap + xml

我的原始请求(根据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>

通过此响应,它告诉我我的请求已正确形成 - 它是具有正确内容类型的SOAP 1.2请求。但是,我的WCF服务不期望这种内容类型,我认为这意味着我没有正确配置它,它仍然认为它是一个SOAP 1.1 Web服务。

最小的Web.config,根据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>

服务合约的片段:

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

我为我的WCF服务启用了服务跟踪,并看到以下异常似乎证实了我的假设:

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>

所以,我的合同和服务绑定可能不匹配,如果相信这个消息,但根据我对WCF的理解,我的配置(或至少它背后的意图)是正确的。

有没有人对我的配置有什么问题有任何想法?

3 个答案:

答案 0 :(得分:9)

我能想到的唯一一件事就是因为你没有在很多细节中指定一个绑定,并且它使用HTTP(根据这个:“聆听'http://mycomputer/MyWs.svc'”)然后是它使用默认值(即basicHttpBinding)来创建不匹配?

答案 1 :(得分:1)

当我的服务有多个绑定时,我遇到了同样的问题。当我删除所有绑定并且只留下一个未命名的绑定时,错误消息就消失了。

答案 2 :(得分:0)

请查看此链接How to: Configure WCF Service to Interoperate with ASP.NET Web Service Clients

  

配置Windows Communication Foundation(WCF)服务端点   要与ASP.NET Web服务客户端互操作,请使用   System.ServiceModel。 BasicHttpBinding 键入您的绑定类型   服务端点。

此外,定义两个端点可以使用同一服务的HTTP和HTTPS版本