WCF服务通过https返回404,但不是http
我正在将HTTP(Dev/UAT)中的现有服务迁移到HTTPS(Production),并且在配置时遇到问题。这里是我的web.config的system.serviceModel部分:WCF服务通过https返回404,但不是http
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="false" />
<services>
<service name="MyService">
<endpoint name="MyEndpoint" address="" binding="wsHttpBinding"
bindingConfiguration="secureBinding" contract="IMyService" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="secureBinding">
<security mode="Transport"></security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
我同时使用basicHttpBinding
和wsHttpBinding
试过,相同的结果:
- 我可以从我的SOAP调用服务使用
http://server.domain.com/MyService.svc
- 我可以用
https://server.domain.com/MyService.svc
- 打从浏览器服务客户,我不能使用
https://server.domain.com/MyService.svc
从我的SOAP客户端调用服务 - 呼叫总是呃与404: not found
罗斯。
我的HTTPS网站使用的是通过对企业域名的CA颁发的证书认证,我已经验证了我有一个安装了CA证书在Trusted Root Certification Authorities
我从中作出呼叫系统。
相关客户端的代码:
Service service = new Service();
service.Url = "http://server.domain.com/MyService.svc";
//service.Url = "https://server.domain.com/MyService.svc";
service.WebMethodCall();
EDIT
下面是WSDL的请求部分:
<wsdl:types/>
<wsdl:portType name="IMyService"/>
<wsdl:binding name="BasicHttpBinding_IMyService" type="tns:IMyService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
</wsdl:binding>
<wsdl:service name="MyService">
<wsdl:port name="BasicHttpBinding_IMyService"
binding="tns:BasicHttpBinding_IMyService">
<soap:address location="http://server.domain.com/MyService.svc"/>
</wsdl:port>
</wsdl:service>
EDIT
更多信息:
当我改变serviceMetadata元素有httpGetEnabled="false"
和httpsGetEnabled="true"
了.svc页面显示我下面的链接:
https://boxname.domain.com/MyService.svc?wsdl
而不是预期的
https://server.domain.com/MyService.svc?wsdl
检查web.config中的服务元素名称是否与实现合同的类的完全限定名称相匹配。
<services>
<service name="MyNamespace.MyService">
<endpoint name="MyEndpoint" address="" binding="wsHttpBinding" ...
原来这是我遇到的问题 - 更新服务名称值后,https端点开始显示在我的WSDL中。我必须在IIS中为该站点设置主机头以获取*正确的*端点,但它们确实显示出来。 – arootbeer 2010-10-07 15:40:06
HTTP和HTTPS供应来自不同的虚拟主机。你确定你的服务已经正确安装吗?
在您的WSDL中,您看到您的服务不会在HTTPS上公开端口,而只会在HTTP上公开端口。此外,您还可以看到您的服务使用BasicHttpBinding(请参阅端口名称和绑定名称)。这意味着您的服务配置根本不被使用。检查服务元素中的名称与.svc标记中的名称相同。必须定义包括名称空间。
感谢Johann Blais的回答,我发现您需要包含定义服务合约的类的全限定名。
例如,如果你的服务是
namespace MyCompany.WcfService
{
[ServiceContract(Namespace="http://xsd.mycompany.com/mcy/1_0_0")]
public interface IService
{
[OperationContract(IsOneWay = false)]
void DoStuff()
}
public class Service : IService
{
void DoStuff()
{
}
}
}
在你的web.config相应的服务定义是
<system.serviceModel>
<services>
<service name="MyCompany.WcfService.IService">
<endpoint address="" binding="basicHttpBinding" contract="MyCompany.WcfService.IService" />
</service>
</services>
...
</system.serviceModel>
如果您在生产服务生成WSDL它包括HTTPS端口? – 2010-10-06 21:29:28
我将在编辑中添加关于WSDL的注释 – arootbeer 2010-10-06 21:33:15
这是预期的,因为您的serviceMetadata仅启用httpGet而不启用httpsGet。你也不能得到服务引用,因为你不暴露mex端点。当您通过HTTP访问WSDL时,重要的是WSDL的内容 - 尤其是描述服务和端口的最后一部分。 – 2010-10-06 21:50:48