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

WCF服务通过https而不是http返回404,wcf,soap,https,Wcf,Soap,Https,我正在将一个现有的服务从HTTP(Dev/UAT)迁移到HTTPS(Production),但配置有问题。以下是my web.config的system.serviceModel部分: <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name=""> <serviceMetadata httpGetEnable

我正在将一个现有的服务从HTTP(Dev/UAT)迁移到HTTPS(Production),但配置有问题。以下是my web.config的system.serviceModel部分:

<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>
编辑

以下是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>
而不是预期的

https://server.domain.com/MyService.svc?wsdl

HTTP和HTTPS由不同的虚拟主机提供。您确定您的服务在这两个版本中都正确安装了吗?

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

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

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


感谢johannblais的回答,我发现您需要为定义服务契约的类包含完全限定的名称

<services>
  <service name="MyNamespace.MyService">
    <endpoint name="MyEndpoint" address="" binding="wsHttpBinding" ...
例如,如果您的服务是

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端口?我将在一个编辑器中添加一个关于WSDL的注释,这是预期的,因为您的serviceMetadata只启用httpGet而不启用httpsGet。此外,您无法获取服务引用,因为您没有公开mex端点。当您通过HTTP访问WSDL时,重要的是它的内容,特别是描述服务和端口的最后一部分。您的意思是什么?我有一个网站,上面有两个绑定:
http://server.domain.com
https://server.domain.com
。啊,好的。真奇怪。运行Fiddler或其他捕获流量的方法会产生有趣的结果吗?(服务器的访问日志显示了什么?)。我在哪里可以看到IIS的流量日志?如果我更改.svc文件中
ServiceHost
指令的
Service
属性中的名称,或者如果我更改web.config中
Service
元素的
name
属性,我会立即看到一个黄色屏幕,显示找不到命名的服务。我的
端点
声明是否有问题?事实上,更改
端点
的任何部分都会导致其中断。它显然在解析web.config文件;它真的没有使用它吗?这就是我遇到的问题——在我更新服务名称值之后,https端点开始出现在我的WSDL中。我必须在IIS中为站点设置主机头才能获得正确的端点,但它们确实出现了。
<system.serviceModel>
    <services>
        <service name="MyCompany.WcfService.IService">
            <endpoint address="" binding="basicHttpBinding" contract="MyCompany.WcfService.IService" />
        </service>
    </services>
    ...
</system.serviceModel>