我有一个REST Web服务,它使用WCF客户端调用外部SOAP Web服务。此REST Web服务在我们的测试环境中托管在IIS中。
当调用REST Web服务,然后调用外部Web服务(使用WCF客户端)时,在IIS中重新启动REST Web服务之后,WCF客户端的第一次调用将引发 SecurityNegotiationException 。第二次调用REST Web服务,间接调用和所有后续调用都成功。
此 SecurityNegotiationException 如下:
System.ServiceModel.Security.SecurityNegotiationException:无法为具有权限“X”的SSL / TLS建立安全通道。 ---> System.Net.WebException:请求已中止:无法创建SSL / TLS安全通道。
端点和绑定如下(通过添加服务引用生成,稍微修改了customBinding):
<endpoint address="https://..." binding="customBinding" bindingConfiguration="MyBinding" contract="WS_..." name="MyEndpoint" />
...
<customBinding>
<binding name="MyBinding">
<textMessageEncoding messageVersion="Soap11" />
<security authenticationMode="UserNameOverTransport" />
<httpsTransport requireClientCertificate="true" />
</binding>
</customBinding>
调用外部Web服务的代码:
MyEndpointClient client = new MyEndpointClient("MyEndpoint");
client.ClientCredentials.UserName.UserName = authInfo.Username;
client.ClientCredentials.UserName.Password = authInfo.Password;
client.ClientCredentials.ClientCertificate.Certificate = authInfo.Certificate;
var result = client.requestInformation(parameters); // This fails the first time after IIS restart.
正在加载authInfo.Certificate,如下所示:
authInfo.Certificate = new X509Certificate2(certificateBytes, certificatePassword);
更多信息:
我尝试过但没有解决问题:
第一次调用SOAP Web服务的想法与下次调用一样稳定吗?
答案 0 :(得分:0)
由于某种原因,这只发生在一个测试服务器上,而不是其他服务器上。
对外部SOAP Web服务的调用的跟踪日志显示内部函数AcquireCredentialsHandle
失败,错误代码为0X8009030D
。
经过一些调查后,我发现了几个安装在相关服务器上的证书(来自外部SOAP Web服务)。它们似乎与对外部SOAP Web服务的调用相冲突。删除这些证书后,第一个呼叫现在成功!
更新:我再次遇到了同样的问题,但现在在我的开发机器上。清理证书没有帮助,所有请求失败并且具有相同的 SecurityNegotiationException 。为了解决这个问题,我添加了HTTP 100状态代码的传递,并强制连接到TLS 1.2:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
请注意,我在之前添加了此代码我初始化了WCF客户端(问题帖子中的 MyEndpointClient ),以确保WCF客户端使用这些设置。