HttpWebRequest 访问网页, 返回System.IO.IOException: 由于远程方已关闭传输流,身份验证失败

lgqiu2008 2016-04-14 11:30:20
网址:https://passport.yhd.com/passport/login_input.do
1号店网站更新,原来可以通过httpwebrequest访问的,更新后不能访问(通过浏览器可以正常访问),提示如下:
System.Net.WebException: 基础连接已经关闭: 发送时发生错误。 ---> System.IO.IOException: 由于远程方已关闭传输流,身份验证失败。

运行环境是.NET 2.0

已百度,找了N种办法
1、ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
2、request.ProtocolVersion = HttpVersion.Version10;
3、ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
4、ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
5、换UserAgent
都不行,请教高人如何解决。

附源码:

// 请先增加引用
using System.Web;
using System.Net;
using System.IO;
using System.Net.Security;
using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Runtime.InteropServices;

public CookieContainer mycookiecontainer = new CookieContainer();
/// <summary>
/// "GET"
/// </summary>
/// <param name="url">web url</param>
/// <param name="Referer">web referer</param>
/// <returns>return the web access result </returns>
public static string GetAccess(string url, string Referer)
{
try
{
HttpWebRequest res = (HttpWebRequest)WebRequest.Create(url);
res.CookieContainer = mycookiecontainer;
res.Method = "GET";
//res.Proxy = null;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
res.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
//res.Headers.Add("Accept-Encoding", "gzip, deflate");
res.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
//res.KeepAlive = false;
res.ProtocolVersion = HttpVersion.Version11;
if (Referer != "")
{
res.Referer = Referer;
}
res.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:30.0) Gecko/20100101 Firefox/30.0";
using (HttpWebResponse resp = (HttpWebResponse)res.GetResponse())
{
resp.Cookies = FormMain.mycookiecontainer.GetCookies(res.RequestUri);
using (Stream responseStream = resp.GetResponseStream())
{
//如果网页流压缩了,要加下面一句
//responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
using (StreamReader mySreamReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")))//GB2312,utf-8,GBK
{
string responseData = mySreamReader.ReadToEnd();
responseStream.Close();
mySreamReader.Close();
resp.Close();
return responseData;
}
}
}
}
catch (Exception ex)
{
return ex.ToString();
}
}

private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true;// Always accept
}

//增加一button,并click事件增加以下代码
private void button1_Click(object sender, EventArgs e)
{
string loginUrl1 = "https://passport.yhd.com/passport/login_input.do";
string result1 = WebTool.GetAccess(loginUrl1, "");
//报错:由于远程方已关闭传输流,身份验证失败
}




另外百度找到一兄弟解决方法,不过是用tcp方式,不适用,所以没尝试,网址:http://blog.csdn.net/atceedsun/article/details/50443657
...全文
722 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgqiu2008 2016-04-15
  • 打赏
  • 举报
回复
最新发现 32位系统下不能访问 ,64位系统可以,不知道是不是64位系统默认支持SSL Protocol:TLS v1.2,坑爹中。。
lgqiu2008 2016-04-14
  • 打赏
  • 举报
回复
再看了下 抓包数据,发现此网页采用SSL Protocol:TLS v1.2,应该是这个问题,求如何在.NET 2.0环境下实行httpwebrequest 访问 。
lgqiu2008 2016-04-14
  • 打赏
  • 举报
回复
现在不用设置SecurityProtocolType又能访问了,看来是1号店后台调整了。。。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧