.NET 4 WCF SOAP服务Http POST返回404 NOT Found

时间:2011-07-10 16:39:32

标签: wcf soap wcf-binding

我有WCF托管的SOAP服务,我可以在发出HTTP GET请求时从浏览器和我的SOAP客户端点击,但是,在执行任何HTTP POST请求时,响应是404 Not Found。

我的Web.config看起来像:

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior>
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
    <bindings>
        <wsHttpBinding>
            <binding>
                <security mode="Transport">
                    <transport clientCredentialType="Certificate" />
                </security>
                <readerQuotas maxDepth="15" maxStringContentLength="524288" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            </binding>
        </wsHttpBinding>
        <basicHttpBinding>
            <binding>
                <readerQuotas maxDepth="15" maxStringContentLength="524288" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            </binding>
        </basicHttpBinding>
    </bindings>
</system.serviceModel>

我的服务在标记中使用.svc文件定义为:

<%@ ServiceHost Language="C#" Debug="true" Service="Boca.WebServices.Billing.QBService" CodeBehind="QBService.svc.cs" %>

同样,我可以使用HTTP GET使用浏览器和SOAP客户端,但不能使用HTTP POST:

我做错了什么?我应该不使用.svc标记,只在Web.config中定义我的服务吗?

更新

当我在本地主机:8181端口上使用IIS Express从VS 2010中“开始调试”我的WCF项目时,HTTP POSTS到服务工作。只有当服务通过IIS托管时,才会拒绝或找不到服务的HTTP POST。

2 个答案:

答案 0 :(得分:9)

我已经解决了这个问题。毕竟,它不是IIS问题,而是我没有使用<basicHttpBinding>节点配置<security>的问题。我没有完全阅读有关绑定及其工作原理的内容,因此我认为在<wsHttpBinding>旁边添加<basicHttpBinding>会为WCF添加SSL支持。

这样做并使用<wsHttpBinding>节点配置默认的<security>肯定允许我安全地获取SOAP元数据,即使内部它仍在使用<basicHttpBinding>,但是不支持POST

我更新了我的配置,以便将transport clientCredentialType设置为None并解决了问题:

<bindings>
    <basicHttpBinding>
        <binding name="QBService_BasicHttpBinding">
            <security mode="Transport">
                <transport clientCredentialType="None" />
            </security>
            <readerQuotas maxDepth="15" maxStringContentLength="524288" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binding>
    </basicHttpBinding>
</bindings>

答案 1 :(得分:2)

假设您使用的是.NET 4,您的服务将使用basicHttpBinding监听一个或多个端点 - 如果您在使用HTTP时未指定端点,则这是默认设置

如果您只有一个服务合同,那么您的服务将在以.svc结尾的地址侦听HTTP POST。如果您有多个服务合同,那么它会在<path to .svc>/<serviceContractname>

这样的地址托管每个合同

该服务期望SOAP请求,因此您需要POST一个与SOAP 1.1匹配的XML文档(basicHttpBinding默认为此)。实现此目的的最简单方法是在客户端项目中使用“添加服务引用”构建代理,并通过生成的代理类进行调用 - WCF管道将生成相应的消息并将其POST到服务