WCF服务绑定内容类型不匹配 - text/xml和application/soap+xml

3

我已经花费了几天时间,试图弄清楚为什么我的绑定出现内容类型不匹配的错误。许多其他人似乎也遇到了这个问题,但所有解决方案都不适用或无效。

我已经到处寻找错误原因:

'/' 应用程序中的服务器错误。

响应消息的内容类型 application/soap+xml; charset=utf-8 与绑定的内容类型 (text/xml; charset=utf-8) 不匹配。如果使用自定义编码器,请确保正确实现 IsContentTypeSupported 方法。响应的前823字节为:

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><GetQuoteResponse xmlns="http://soap.service.GMO.com"><Quote_Response><errorMessage></errorMessage><return_List><item><errorMessage></errorMessage><monthlyPremiumAmount>6.0</monthlyPremiumAmount><webID>7P3W4Txst</webID><basePer1>1000.0</basePer1><basePer2>0.0</basePer2><baseRate1>0.05</baseRate1><baseRate2>0.0</baseRate2><benefitID>5365</benefitID><coverageAmount>100000</coverageAmount><grossPer1>1000.0</grossPer1><grossPer2>0.0</grossPer2><grossRate1>0.06</grossRate1><grossRate2>0.0</grossRate2></item></return_List></Quote_Response></GetQuoteResponse></soapenv:Body></soapenv:Envelope>

我要调用的 Web 服务没有托管在 IIS 上。Web 服务本身似乎工作正常,因为我们使用了 SoapUI 并得到了所有正确的结果。从上面的错误消息中可以看出,值正在从 Web 服务返回。

我还使用了 Fiddler,并能够确认请求标头内容类型为 text/xml,而响应标头内容类型为 application/soap+xml。

我们有一个数据层,其中包含服务引用。App.config 如下所示:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="IMSQuoteServiceBinding" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default"  />
                </security>

            </binding>

        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://hostingServerName:81/cgi-bin/jsmdirect?IMSQuote"
            binding="basicHttpBinding" bindingConfiguration="IMSQuoteServiceBinding"
            contract="Quote.IMSQuoteServicePortType" name="IMSQuoteServicePort" />
    </client>
</system.serviceModel>

网站的web.config文件如下:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="IMSQuoteServiceBinding" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
        useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
            realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>

    </binding>
  </basicHttpBinding>    

</bindings>
<client>
  <endpoint address="http://hostingServerName:81/cgi-bin/jsmdirect?IMSQuote"
      binding="basicHttpBinding" bindingConfiguration="IMSQuoteServiceBinding"
      contract="Quote.IMSQuoteServicePortType" name="IMSQuoteServicePort" />
</client>

任何帮助都将不胜感激。我对WCF还比较陌生,欢迎各种想法和建议。
非常感谢您的帮助。如果您需要更多信息,请告诉我。

只是为了确认,如果您使用 Fiddler 更改服务器响应的 Content-Type 标头为 text/xml; charset=utf-8,客户端会接受吗? - EricLaw
我还没有尝试过那个。我会试一试并让你知道。谢谢这个想法。 - user1895520
1个回答

4

更新一下。

我将服务绑定从basicHttpBinding更改为wsHttpBinding。更改绑定到wsHttpBinding会将SOAP服务发送为SOAP 1.2调用,而不是SOAP 1.1调用。一旦我这样做了,发送和接收调用上的内容类型就匹配了,解决了绑定不匹配的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接