我无法连接到使用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或其他错误。浏览器的行为就像无法打开与目标端口的连接一样。服务器似乎甚至看不到传入的连接。
答案 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
程序执行此操作最为简单。