WCF 客户端:第一次调用失败,第二次调用成功

我有一个 REST 网络服务,它使用 WCF 客户端调用外部 SOAP 网络服务。此 REST Web 服务托管在我们测试环境中的 IIS 中。

当调用 REST web 服务时,后者调用外部 web 服务(使用 WCF 客户端),在 IIS 中重新启动 REST web 服务后,WCF 客户端的第一次调用会抛出SecurityNegotiationException。对 REST Web 服务的第二次调用以及间接调用和所有后续调用均成功。

为了说明这一点,这里有一张图片:

http://img.mukewang.com/60bad177000137bf06700395.jpg

此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>

调用外部webservice的代码:


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);


拉莫斯之舞
浏览 356回答 1
1回答

慕标5832272

出于某种原因,这仅发生在一台测试服务器上,而不发生在其他服务器上。对外部 SOAP 网络服务调用的跟踪日志显示内部函数AcquireCredentialsHandle失败并显示错误代码0X8009030D。经过更多调查,我发现了安装在相关服务器上的几个证书(来自外部 SOAP 网络服务)。它们似乎与对外部 SOAP 网络服务的调用相冲突。删除这些证书后,第一次调用现在成功了!更新:我再次遇到同样的问题,但现在在我的开发机器上。清除证书无济于事,所有请求都失败并出现相同的SecurityNegotiationException。为了解决这个问题,我为 HTTP 100 状态代码添加了一个传递,并强制连接到 TLS 1.2:ServicePointManager.Expect100Continue = true;ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;请注意,我在初始化 WCF 客户端(问题帖子中的MyEndpointClient)之前添加了此代码,以确保 WCF 客户端使用这些设置。
打开App,查看更多内容
随时随地看视频慕课网APP