无法将WCF服务请求作为SOAP + XML发送

时间:2011-05-31 11:08:44

标签: c# wcf soap xmlspy

使用Visual Studio 2010,我开发了一个托管在Web应用程序上的WCF服务,供第三方使用。他们告诉我他们不能援引它。为了进行测试,他们将我重定向到Altova XmlSpy并指出,在创建新的SOAP请求时,如果他们选择“发送为SOAP + XML(SOAP 1.2)”,请在“更改SOAP请求参数”菜单项中选中它们,以下两个警告对话框:

HTTP error: could not POST file ‘/TurniArc/WebServices/Processi.svc’ on server ’10.51.0.108’ (415)

Error sending the soap data to ‘http://10.51.0.108/TurniArc/WebServices/Processi.svc’ HTTP error: could not POST file ‘/TurniArc/WebServices/Processi.svc’ on server ’10.51.0.108’ (415)

我确实证实了这一点。 取消选中该选项,请求按需提交。我使用soapUI(我一直用于内部测试的软件)调用我的Web服务时从来没有遇到任何问题。

这是我创建的第一个Web服务,从没有任何理论知识开始(但我想每个人都做:-)),所以我甚至不确定在哪里解决这个问题。问题可能在于绑定吗?我使用Add / New Item / WCF Service创建了服务并保留了所有默认选项,因此它应该是BasicHttpBinding

这是我的web.config

的serviceModel部分
<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>
<!--other bindings related to proxies to other services I'm invoking -->
</system.serviceModel>

我的界面只有

[ServiceContract(Namespace="http://www.archinet.it/HRSuite/Processi/")]

属性和实现它的类具有

[ServiceBehavior(IncludeExceptionDetailInFaults = true, Namespace = "http://www.archinet.it/HRSuite/Processi/")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

属性

谢谢

编辑:第三方正在使用Oracle SOA中间件

1 个答案:

答案 0 :(得分:2)

BasicHttpBinding使用SOAP 1.1,因此您无法使用此绑定将SOAP 1.2中的请求发送到端点。 HTTP状态代码415表示不支持的媒体类型,这也暗示了这一点,因为SOAP 1.1使用text / xml内容类型,而SOAP 1.2使用application / soap + xml内容类型。

如果您希望BasicHttpBinding与SOAP 1.2等效,而WsHttpBinding中不包含任何其他WS- *内容,则需要创建自定义绑定。最简单的版本如下:

<bindings>
  <customBinding>
    <binding name="soap12">
      <textMessageEncoding messageVersion="Soap12" />
      <httpTransport />
    </binding>
  </customBinding>
</bindings>

然后,您必须手动定义服务的端点(在使用默认端点时):

<services>
  <service name="YourNamespace.YourServiceClass">
    <endpoint address="" binding="customBinding" bindingConfiguration="soap12" 
              contract="YourNamespace.YourServiceContractInterface" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>

无论如何,我几乎不相信重新配置SOAP版本以便在Oracle SOA中间件中使用您的服务需要花费几分钟的时间。