C# 身份验证失败,因为远程方已关闭传输流
Posted
技术标签:
【中文标题】C# 身份验证失败,因为远程方已关闭传输流【英文标题】:C# Authentication failed because the remote party has closed the transport stream 【发布时间】:2017-08-18 09:30:14 【问题描述】:我想指出,我已经为此搜索了很多但没有解决方案。因此,我创建了一个循环,它将抛出包含链接的 listBox2,每次创建一个 http GET 请求以访问完整的源代码。
我的代码:
private void button4_Click(object sender, EventArgs e)
try
for (int i = 0; i < listBox2.Items.Count; i++)
code(listBox2.Items[i].ToString() + "\'");
//await PutTaskDelay();
//Console.WriteLine(listBox2.Items[i].ToString());
if (VarrileKeeper.s.ToLower().Contains("mysql"))
Console.WriteLine("possitive " + listBox2.Items[i].ToString());
catch (Exception Fejl)
Console.WriteLine(Fejl);
public static String code(string Url)
System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate return true; ;
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(Url);
myRequest.MaximumAutomaticRedirections = 4;
myRequest.MaximumResponseHeadersLength = 4;
myRequest.Credentials = CredentialCache.DefaultCredentials;
myRequest.Method = "GET";
WebResponse myResponse = myRequest.GetResponse();
StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8);
string result = sr.ReadToEnd();
sr.Close();
myResponse.Dispose();
myResponse.Close();
VarrileKeeper.s = result;
return result;
当循环命中各种 url 例如 (http://www.memphremagog.org/fr/lexique.php?id=32) 时会触发以下错误。奇怪的是,如果我删除循环并向该站点发出 http GET 请求,一切正常。
“System.Net.WebException”类型的第一次机会异常发生在 System.dll System.Net.WebException:底层连接是 关闭:发送时发生意外错误。 ---> System.IO.IOException:身份验证失败,因为远程方 已关闭传输流。
我认为证书没有问题,否则当我删除循环时,http://www.memphremagog.org/fr/lexique.php?id=32 上仍然会出现错误。
欢迎提出任何建议。
【问题讨论】:
当你调试时,在你的 code() 方法中你传递的字符串是什么?是不是类似于“http://www.memphremagog.org/fr/lexique.php?id=32\'”?确保您传递的 URL 有效 代码是否可以在循环中正常工作,并且只是间歇性地失败?还是循环永远不起作用? 该 URL 是有效的,否则当我在循环外运行 code() 时它不起作用我已经在循环外手动测试了所有链接,女巫工作没有错误。循环工作正常,直到它点击例如这个 url (memphremagog.org/fr/lexique.php?id=32) 并且当我在循环外使用该 url 运行它时它工作正常。所以对我来说,在我开始循环之前似乎一切正常。是的,它只是间歇性地发生。 调试并在遇到错误时检查字符串Url的值。 woah woah woah .. 您正在尝试扫描 mysql 注入漏洞,不是吗。 【参考方案1】:来自您的 cmets 的 zvoxaudio.com 网址非常棘手。他们有一些机器人检测,用于将物品添加到购物车。您专门使用的链接似乎无论如何都不起作用,我认为它使用的是过期的项目ID;我可以通过将 id 更新为 4007001 并将其更改为“https”来使用它。但是,此链接正在将商品添加到购物车,并且该站点不允许机器人将商品添加到购物车,该站点返回 400 错误,标题中带有此键:值:
X-Error-Message: Bots are not allowed to add items to cart
尝试像这样将 UserAgent 添加到您的请求中:
myRequest.UserAgent = "Nada";
有了这些改动,ZVOXAUDIO 链接就可以工作了!
如果您想将网址保留为“https”请求,只需将其添加到您的代码中即可。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
这是必需的,因为 ZVOXAUDIO 不支持 TLS 1.0 或更早的协议。如果您使用的 .NET 版本不支持 TLS 1.2,您可以使用 SecurityProtocolType.Tls11,因为 ZVOXAUDIO 仍然支持 TLS 1.1。
但是,大概是因为您正试图在尽可能多的站点上运行它,您可能不想只允许 TLS 1.2,因为旧的服务器可能不支持它。我会这样设置你的安全协议:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 |
SecurityProtocolType.Tls11 |
SecurityProtocolType.Tls |
SecurityProtocolType.Ssl3;
作为建议,您可以在循环之外设置服务器证书验证回调和安全协议,因为它是所有请求的静态设置。此外,如果您使用 C# 语法,Dispose 方法会为您关闭和处理您的 WebResponse 和 StreamReader 变量。而 C# 在 .NET 3.0 中引入了“var”,您可能想开始接受它,假设您使用的是 3.0 或更新的框架。如果你想看看这会是什么样子,请看下面。
确保你有这些用法:
using System;
using System.IO;
using System.Net;
然后将这两行放入表单或对象的静态构造函数中,我假设您现在正在使用表单:
ServicePointManager.ServerCertificateValidationCallback = delegate return true; ;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
那么你的两个方法应该是这样的:
private void button4_Click(object sender, EventArgs e)
try
for (var i = 0; i < listBox2.Items.Count; i++)
var response = Code(listBox2.Items[i].ToString() + "\'");
if (response.ToLower().Contains("mysql"))
Console.WriteLine("positive " + listBox2.Items[i].ToString());
catch (Exception ex)
Console.WriteLine(ex.Message);
public static string Code(string url)
var webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.MaximumAutomaticRedirections = 4;
webRequest.MaximumResponseHeadersLength = 4;
webRequest.UserAgent = "Mozilla/5.0 (Taco2) Gecko/20100101";
webRequest.Credentials = CredentialCache.DefaultCredentials;
webRequest.Method = "GET";
using (var webResponse = webRequest.GetResponse())
using (var sr = new StreamReader(webResponse.GetResponseStream(), System.Text.Encoding.UTF8))
return sr.ReadToEnd();
编码愉快!如有任何问题,请随时在下面的 cmets 中提问。
【讨论】:
【参考方案2】:这是由于安全协议问题而发生的。只需在请求上下文之前添加以下行。
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
【讨论】:
【参考方案3】:这发生在我身上,但对我来说,这是由于安全协议问题。
只需添加这一行
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
更多信息 -> https://codeshare.co.uk/blog/how-to-fix-the-error-authentication-failed-because-the-remote-party-has-closed-the-transport-stream/
【讨论】:
【参考方案4】:就我而言,问题在于我使用的邮件服务(mailgun)的凭据。
自创建凭据以来已过去 1 年,所以我想需要更新。
重置凭据密码为我解决了这个问题。
【讨论】:
【参考方案5】:只需在您的网络请求上方调用以下函数:
protected void Application_Start()
if (ServicePointManager.SecurityProtocol.HasFlag(SecurityProtocolType.Tls12) == false)
ServicePointManager.SecurityProtocol = ServicePointManager.SecurityProtocol | SecurityProtocolType.Tls12;
【讨论】:
以上是关于C# 身份验证失败,因为远程方已关闭传输流的主要内容,如果未能解决你的问题,请参考以下文章
iOS (APN) - 身份验证失败,因为远程方已关闭 C# 中的传输流