WCF ServiceHost似乎为每条消息

时间:2016-07-27 19:34:23

标签: c# wcf ssl servicehost

我有一个使用X509Certificate

保护的WCF ServiceHost
Credentials.ServiceCertificate.Certificate = certificate;

和自定义客户端证书验证程序:

Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.Custom;
Credentials.ClientCertificate.Authentication.CustomCertificateValidator = new CustomX509CertificateValidator();

InstanceContextMode和ConcurrencyMode是它们的默认值PerSession和Single。

我的终端使用传输安全性并需要客户端证书:

BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

AddServiceEndpoint(typeof(...), binding, endpoint);

我希望(并且期望)在新连接的SSL握手期间调用一次自定义客户端证书验证器,但是在收到的每条消息上都会调用它。

客户端WCF跟踪日志显示了大量流量,包括发送第一条消息时的4秒延迟,我假设是SSL握手,密码协商和密钥交换,但我看不到字节。

client trace, first message

几秒钟后发送第二条消息时没有相应的延迟,所以我假设我有一个安全会话,并且没有发送客户端证书。

client trace, second message

但是仍在调用自定义客户端证书验证程序!

我到底做错了什么?!

1 个答案:

答案 0 :(得分:0)

现在我们更好地理解了服务实例行为,我们决定使用BasicHttpBinding绑定的行为。

我们希望记录远程SSL客户端提供的证书的证书过期信息,但是当在每条消息上调用验证器时,我们无法轻松完成。真是个耻辱。

我们认为没有简单的方法可以在不更改所有客户端的绑定的情况下更改服务绑定。

我非常喜欢WCF,但是服务实例行为受绑定和安全性选择影响的方式并没有很好的记录。