我有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。
答案 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到服务