【问题标题】:Unable to connect to self-hosted WCF service over HTTPS无法通过 HTTPS 连接到自托管 WCF 服务
【发布时间】:2013-01-14 23:18:43
【问题描述】:

我无法连接到使用 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 或其他错误。浏览器的行为就好像它无法打开到目标端口的连接一样。服务器似乎甚至没有看到传入的连接。

【问题讨论】:

  • 你得到了什么错误信息?
  • 服务主机运行的是什么用户上下文,可能是访问X509证书的权限问题
  • 你试过客户端的fiddler吗?

标签: wcf https self-hosting


【解决方案1】:

问题出在我没有为我的端口注册 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 程序执行此操作是最简单的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多