3

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

4

1 回答 1

3

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

于 2013-01-31T18:04:36.473 回答