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

时间:2010-10-06 21:14:24

标签: wcf soap https

我正在将现有服务从HTTP(Dev / UAT)迁移到HTTPS(生产),我遇到配置问题。这是我的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>

我使用basicHttpBindingwsHttpBinding尝试了这一点,结果相同:

  • 我可以使用http://server.domain.com/MyService.svc
  • 从我的SOAP客户端调用该服务
  • 我可以使用https://server.domain.com/MyService.svc
  • 从浏览器点击该服务
  • 我无法使用https://server.domain.com/MyService.svc从我的SOAP客户端调用该服务 - 调用总是出现404: not found错误。

我的https网站使用公司域上的CA颁发的证书进行了认证,我已经验证我在Trusted Root Certification Authorities上安装了CA证书,我正在制作该证书调用

相关客户代码:

Service service = new Service();
service.Url = "http://server.domain.com/MyService.svc";
//service.Url = "https://server.domain.com/MyService.svc";
service.WebMethodCall();

修改

以下是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>

修改

更多信息:

当我将serviceMetadata元素更改为httpGetEnabled="false"httpsGetEnabled="true"时,.svc页面会显示以下链接:

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

而不是预期的

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

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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