WCF服务通过https返回404,但不是http

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> 

我同时使用basicHttpBindingwsHttpBinding试过,相同的结果:

  • 我可以从我的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 
+0

如果您在生产服务生成WSDL它包括HTTPS端口? – 2010-10-06 21:29:28

+0

我将在编辑中添加关于WSDL的注释 – arootbeer 2010-10-06 21:33:15

+0

这是预期的,因为您的serviceMetadata仅启用httpGet而不启用httpsGet。你也不能得到服务引用,因为你不暴露mex端点。当您通过HTTP访问WSDL时,重要的是WSDL的内容 - 尤其是描述服务和端口的最后一部分。 – 2010-10-06 21:50:48

检查web.config中的服务元素名称是否与实现合同的类的完全限定名称相匹配。

<services> 
    <service name="MyNamespace.MyService"> 
    <endpoint name="MyEndpoint" address="" binding="wsHttpBinding" ... 
+0

原来这是我遇到的问题 - 更新服务名称值后,https端点开始显示在我的WSDL中。我必须在IIS中为该站点设置主机头以获取*正确的*端点,但它们确实显示出来。 – arootbeer 2010-10-07 15:40:06

HTTP和HTTPS供应来自不同的虚拟主机。你确定你的服务已经正确安装吗?

+0

你是什么意思?我有一个网站上有两个绑定:'http:// server.domain.com'和'https:// server.domain.com'。 – arootbeer 2010-10-06 21:32:22

+0

啊,好的。这很奇怪。运行Fiddler或其他东西来捕捉流量会产生什么有趣的结果吗? (服务器的访问日志显示什么?) – Yuliy 2010-10-06 21:37:35

+0

Fiddler显示请求已经通过,但由于加密,它不能显示任何有趣的内容。我在哪里可以看到IIS的流量日志? – arootbeer 2010-10-06 21:42:35

在您的WSDL中,您看到您的服务不会在HTTPS上公开端口,而只会在HTTP上公开端口。此外,您还可以看到您的服务使用BasicHttpBinding(请参阅端口名称和绑定名称)。这意味着您的服务配置根本不被使用。检查服务元素中的名称与.svc标记中的名称相同。必须定义包括名称空间。

+0

如果我在.svc文件中的ServiceHost指令的'Service'属性中更改了名称,或者如果我更改web.config中的'service'元素的'name'属性,我立即得到一个黄色屏幕上显示指定的服务无法找到。我的端点声明有什么问题吗? – arootbeer 2010-10-07 01:29:22

+0

实际上,更改*端点的任何*部分都会导致中断。这显然是解析web.config文件;它真的没有使用它? – arootbeer 2010-10-07 01:57:27

感谢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>