我正在使用C# (.Net Framework3.5)应用程序中的SSL POST调用来实现登录/注销功能。通过HttpWebRequest::BeginGetResponse()从服务器获取响应有80%的时间是有效的,但另外20%是间歇性抛出的:
The request was aborted: Could not create SSL/TLS secure channel.我使用另一个问题中的suggested文章启用了SSL跟踪。这在请求跟踪中产生了两种截然不同的模式。
似乎在执行过程中,错误:
System.Net Error: 0 : [3680] Decrypt returned SEC_I_RENEGOTIATE.正在被接收,导致重新初始化安全上下文。当这种情况发生时,并且成功了,下面是输出(注意,我省略了实际地址):
System.Net Error: 0 : [3680] Decrypt returned SEC_I_RENEGOTIATE.
System.Net Information: 0 : [3680] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [3680] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=78, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=1259, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=OK).
System.Net Information: 0 : [7148] Remote certificate: [Version]
V1当它失败时:
System.Net Error: 0 : [3680] Decrypt returned SEC_I_RENEGOTIATE.
System.Net Information: 0 : [3680] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0ab50, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [3680] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=78, returned code=ContinueNeeded).
System.Net Error: 0 : [3680] Exception in the HttpWebRequest#20730349:: - The request was aborted: Could not create SSL/TLS secure channel.
System.Net Verbose: 0 : [3680] HttpWebRequest#20730349::EndGetResponse()
System.Net Error: 0 : [3680] Exception in the HttpWebRequest#20730349::EndGetResponse - The request was aborted: Could not create SSL/TLS secure channel.我当然可以捕捉到这个异常,但是正确的处理是什么呢?
我的应用程序有没有办法防止(或正确处理)这些错误?当这种情况发生时,它似乎会在一段时间内不断出错,但在一些不确定的请求数量之后,它又开始工作。
谢谢!
发布于 2012-02-15 04:41:56
这既不是解释,也不是真正的解决方案:它只是我们在我们的案例中发现的处理此问题的最实用的方法(在基于Apache和Java的服务器上使用客户端SSL证书通过HTTPS执行WCF SOAP请求)。
捕获SecurityNegotiationException并现场重试(即,如果使用msmq,而不是重新处理消息),并在这种情况下禁止报告异常。只需包含一个性能计数器或类似的简单东西,这样您就可以跟踪问题是否变得更糟。
归根结底,这只是您的代码需要处理的与网络相关的先天问题之一。
发布于 2017-01-28 22:59:10
我想我应该分享我的经验,因为我最近读到了关于这个的大多数stackoverflow问题:
我看到的另一种方法是考虑HTTP Keep-Alive。对于最新版本的.Net,它使用HTTP1.1作为默认设置,这意味着Keep-Alive被设置为true,Expect100也被设置为on。
根据我的经验,这会在下游资源上产生粘性,并且在负载均衡器背后是不可靠的。
两个选择
1)恢复,然后再试一次,看起来有点难闻。然而,正如Khanfx所提到的,网络问题可能会因此而发生:网络的谬误。TOPAZ是解决这个问题的一种方法:https://msdn.microsoft.com/en-us/library/hh680901%28v=pandp.50%29.aspx?f=255&MSPPError=-2147217396
2)通过HttpwebRequest关闭Keep-Alive,或者如果使用HttpClient,则发出连接关闭头部。
HTH。
https://stackoverflow.com/questions/6232746
复制相似问题