验证失败,因为远程方在从 web 服务获取响应时关闭了传输流异常

Posted

技术标签:

【中文标题】验证失败,因为远程方在从 web 服务获取响应时关闭了传输流异常【英文标题】:Authentication failed because the remote party has closed the transport stream exception when getting a response from webservice 【发布时间】:2016-06-07 21:30:06 【问题描述】:

我正在调用第三方服务,当我要求响应时,它会抛出一个异常,上面写着

“验证失败,因为对方已经关闭了传输流异常”。

我认为发送凭据时出现问题。我什至尝试过提供新的凭据。这是完整的代码

string get_url = "https://**.*******.com/com/******/webservices/public_webservice.cfc?wsdl&Method=CreateUser&SiteID=**&WSPassword=******&UserName=******";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(get_url);
request.MaximumAutomaticRedirections = 4;
request.MaximumResponseHeadersLength = 4;
request.Credentials = CredentialCache.DefaultCredentials;
//request.UseDefaultCredentials = false;
//request.Credentials = new System.Net.NetworkCredential("*****", "*****");
request.ContentType = "application/x-www-form-urlencoded; charset=ISO-8859-1";

// Show the sent stream
//lbl_send_stream.Text = send_stream;
//lbl_send_stream.Text = get_url;
// Get UserId And LoginToken From Third Party DB
// ==============================================
//Exception gets throwed When code hits here
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

【问题讨论】:

***.com/questions/19639846/… 我试过了,还是没有解决问题。 Authentication failed because remote party has closed the transport stream的可能重复 【参考方案1】:

我找到了答案,这是因为我们调用的第三方 Web 服务不支持 TLS 1.0,他们支持 1.1 和 1.2。所以我不得不更改安全协议。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

【讨论】:

您可以在从请求中获取 HTTPResponse 之前添加它。 我的 SecurityProtocolType 不显示 Tls12 和 Tls11 的选项。我正在使用 .net 框架 4。 .Net 4.0 不知道 Tls11 和 Tls12。要访问那些您需要使用 .Net 4.5 或更高版本的内容。 如果使用 .Net 4.0,您可以为 TLS1.2 使用数值 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; 另请参阅blogs.perficient.com/microsoft/2016/04/tsl-1-2-and-net-support 了解其他选项和框架。【参考方案2】:

我也有同样的问题,一开始我更改了安全协议但没有用,然后我意识到我需要在创建 WebRequest 之前更改安全协议:

  ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
        WebRequest request = WebRequest.Create(fullURL);
        request.Headers = requestHeaders;
        byte[] Bytes = System.Text.Encoding.ASCII.GetBytes(jsonData);

【讨论】:

【参考方案3】:

我有一个限制,只能使用 TLS 1.2,而且资源地址(URL/地址)是本地的。所以上面的解决方案对我不起作用。在仔细分析了 web.config 之后,我尝试使用 <bypasslist> 作为本地 URL,奇迹发生了!

<system.net>
    <defaultProxy>
      <proxy usesystemdefault="false" proxyaddress="<yourproxyaddress>" bypassonlocal="true" />
      <bypasslist>  
        <add address="[a-z]+\.abcd\.net\.au$" />  
      </bypasslist>
    </defaultProxy>
</system.net>

请注意,我已经使用&lt;proxy&gt; 设置来访问其他外部 URL,因此也不允许没有此设置。希望这会有所帮助!

【讨论】:

如果我在尝试使用 CMD 生成代码时遇到此错误怎么办? 试试这个:add-type @" using System.Net; using System.Security.Cryptography.X509Certificates; public class TrustAllCertsPolicy : ICertificatePolicy public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) return true; "@ [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

以上是关于验证失败,因为远程方在从 web 服务获取响应时关闭了传输流异常的主要内容,如果未能解决你的问题,请参考以下文章

连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败

如何解决“连接尝试失败,因为连接方在一段时间后没有正确响应......”错误?

SQLSTATE[HY000] [2002] 连接尝试失败,因为连接方在一段时间后没有正确响应,

System.Net.Sockets.SocketException (10060):连接尝试失败,因为连接方在一段时间后没有正确响应

HttpWebrequest 失败,内部异常身份验证失败,因为远程方已关闭传输流

即使在从服务器获得响应后,失败函数也会得到回调