.Net 4.6 WebClient 在IPV6下无法访问网络

TiMorGO 2018-08-30 09:09:55
测试 API:WebClient

环境:ipv6
.net Framework: .net3.5
测试结果:可以访问

环境:ipv6
.net Framework: .net4.6
测试结果: 无法访问网络

------------------我是测试分割线--------------------
环境:ipv4
.net Framework: .net3.5
测试结果:可以访问

环境:ipv4
.net Framework: .net4.6
测试结果:可以访问

测试代码:

using UnityEngine;
using System;

public class NewBehaviourScript1 : MonoBehaviour {

void Start () {
try
{
WebClientEx webClient = new WebClientEx(5);
webClient.DownloadString("https://www.baidu.com/");
}
catch (Exception e)
{
Debug.Log(e);
}
}
}



WebClient扩展代码:

using System.Collections.Specialized;
using System.Net;
using System;

public class WebClientEx : WebClient
{
public string m_Url;
public int m_TimeOut;

public WebClientEx(int timeout)
{
m_TimeOut = 1000 * timeout;
}

protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest request;
if (address.Scheme == "https")
{
ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => { return true; };
request = (HttpWebRequest)base.GetWebRequest(address);
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = (HttpWebRequest)base.GetWebRequest(address);
}

request.Timeout = m_TimeOut;
request.ReadWriteTimeout = m_TimeOut;
m_Url = address.OriginalString;
request.AllowAutoRedirect = false;
request.AllowWriteStreamBuffering = true;


CookieContainer cookieContainer = new CookieContainer();
NameValueCollection collection = new NameValueCollection();
collection.Add("Accept-Language", "zh-cn,zh;q=0.5");
collection.Add("Accept-Encoding", "gzip,deflate");
collection.Add("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");
collection.Add("Keep-Alive", "115");
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
request.Headers.Add(collection);
request.CookieContainer = cookieContainer;

request.ServicePoint.BindIPEndPointDelegate = (servicePoint, remoteEndPoint, retryCount) =>
{
if (remoteEndPoint.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
return new IPEndPoint(IPAddress.IPv6Any, 0);
else
return new IPEndPoint(IPAddress.Any, 0);
};

return request;
}
}
...全文
743 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员的键盘 2018-09-07
  • 打赏
  • 举报
回复
如果是https不行,可以试试加上
if (address.Scheme == "https")
{
ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => { return true; };
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;//配置协议 4.6 好像默认不设SecurityProtocolType.Ssl3
request = (HttpWebRequest)base.GetWebRequest(address);
request.ProtocolVersion = HttpVersion.Version10;
}

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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