无法通过HTTPS连接到自托管WCF服务

时间:2013-01-30 23:35:30

标签: wcf https self-hosting

我无法连接到使用WebHttp + HTTPS绑定运行的自托管WCF服务。由于各种原因,我完全用代码配置服务而不是使用配置文件,我用这种方式实例化服务:

private ServiceHost CreateService()
{
    Type myServiceType = typeof(MyService);
    ServiceHost myService = new ServiceHost(myServiceType, new Uri(Constants.ServiceAddress));
    ContractDescription contract = ContractDescription.GetContract(myServiceType);

    WebHttpBinding httpsBinding = new WebHttpBinding(WebHttpSecurityMode.Transport);
    httpsBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;

    ServiceEndpoint endpoint = myService.AddServiceEndpoint(myServiceType, httpsBinding, "MyService.svc");
    endpoint.Behaviors.Add(new WebHttpBehavior());

    ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
    metadataBehavior.HttpGetEnabled = true;
    metadataBehavior.HttpsGetEnabled = true;
    myService.Description.Behaviors.Add(metadataBehavior);

    myService.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine, 
        StoreName.My, 
        X509FindType.FindByThumbprint, 
        Constants.CertThumbprint);

    return myService;
}

当我运行此代码时,该服务被实例化并启动而没有错误。当我在代码中查询时,该服务声称是开放的,并且netstat表明有人正在侦听相应的端口。我有一个防火墙例外,它允许此端口上的传入连接。

但是,如果我尝试在浏览器或客户端中打开服务端点地址,则连接会立即失败。有什么线索的原因?是否有我忘记的服务主机或环境的配置?

修改

没有要报告的错误消息---没有404,500或其他错误。浏览器的行为就像无法打开与目标端口的连接一样。服务器似乎甚至看不到传入的连接。

1 个答案:

答案 0 :(得分:3)

问题是我没有为我的端口注册SSL证书。以下代码行不起作用:

myService.Credentials.ServiceCertificate.SetCertificate(
    StoreLocation.LocalMachine, 
    StoreName.My, 
    X509FindType.FindByThumbprint, 
    Constants.CertThumbprint);

仅当您打算对客户端使用证书身份验证时,才设置服务凭据。如果您使用的是HTTPS,则需要为正在侦听的端口注册SSL证书。发出以下命令可解决此问题:

netsh http add sslcert ipport=0.0.0.0:443 certhash=0b740a29f29f2cc795bf4f8730b83f303f26a6d5 appid={00112233-4455-6677-8899-AABBCCDDEEFF}

还有一个非托管接口可以执行此操作,但不存在托管包装器,因此使用netsh程序执行此操作最为简单。

相关问题