WCF和肥皂1.1

时间:2010-02-09 14:31:34

标签: c# .net wcf web-services soap

我正在尝试创建第三方应该消费的服务 使用者与SOAP 1.1兼容,这就是我为服务器使用basicHttpBinding的原因。当提出实际请求时,服务器期望的内容类型似乎出现了问题。使用basicHttpBinding我不明白为什么服务器仍然需要'application / soap + xml',据我所知,这只是SOAP 1.2所要求的。

我已经使用过wireshark来弄清楚这两个人正在沟通的内容。请参阅下面的tcp流和设置。

任何帮助表示赞赏。

第三方应用请求

  

POST / HTTP / 1.1

     

的SOAPAction:   http://tempuri.org/ITestService/Hello

     

Content-Type:text / xml;字符集= UTF-8

     

主持人:shdesktop:8000

     

内容长度:297

     

期待:100-continue

     

连接:关闭

WCF服务器响应

  

HTTP / 1.1 415无法处理   消息因为内容类型   “文本/ XML; charset = utf-8'不是   预期类型'application / soap + xml;   字符集= UTF-8' 。

     

内容长度:0

     

服务器:Microsoft-HTTPAPI / 2.0

     

日期:2010年2月9日星期二14:03:19 GMT

     

连接:关闭

服务配置

<system.serviceModel>
    <services>
      <service behaviorConfiguration="behTestService" name="ConsoleApplication1.TestService">
        <endpoint address="" binding="mexHttpBinding" contract="IMetadataExchange" />
        <endpoint address="TestService" binding="basicHttpBinding"
            contract="ConsoleApplication1.ITestService" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="behTestService">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

3 个答案:

答案 0 :(得分:18)

basicHttpBinding确实使用SOAP 1.1 - 但在这种情况下,您的内容类型为application/soap+xml

由于您的客户端正在发送text/xml - 他们是否有机会期待REST接口?这将由WCF webHttpBinding处理。

MSDN WCF REST Developer Center上阅读有关WCF中REST的更多信息,并查看Pluralsight screencast series on WCF REST - 强烈推荐!

答案 1 :(得分:6)

通常,当我们在包含文本的Web服务中收到消息/错误时:

content type 'text/xml'

这意味着Web服务器返回了错误页面而不是预期的xml响应。

答案 2 :(得分:3)

我有完全相同的问题 - 定义是说它是肥皂1.2,但期望1.1,因为内容类型不同。

我发现如果我调整了服务器配置:

...
<endpoint address="" .../>
    <host>
        <baseAddresses>
            <add baseAddress="http://localhost:8001/services/fooService" />
        </baseAddresses>
    </host>
...

要:

...
<endpoint address="fooService" .../>
    <host>
        <baseAddresses>
            <add baseAddress="http://localhost:8001/services" />
        </baseAddresses>
    </host>
...

wsdl这次将它暴露为Soap 1.1。