最近做在一个一个项目,需要访问微信接口。下面是我的代码:
public static string GetaouthAccess_token(string appid, string secret, string code)
{
//return PostRequest("https://api.weixin.qq.com/sns/oauth2/access_token", string.Format("appid={0}&secret={1}&code={2}&grant_type=authorization_code", appid, secret, code));
string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appid, secret, code);
//return Senparc.Weixin.HttpUtility.RequestUtility.HttpGet(url, null);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(new Uri(url));
//是否使用 Nagle 不使用 提高效率
req.ServicePoint.UseNagleAlgorithm = false;
//最大连接数 ,因为出现并发问题之后我才设置的。
req.ServicePoint.ConnectionLimit = 65500;
//数据是否缓冲 false 提高效率
req.AllowWriteStreamBuffering = false;
req.Proxy = GlobalProxySelection.GetEmptyWebProxy();
req.ServicePoint.Expect100Continue = false;
req.KeepAlive = false;
req.ProtocolVersion = HttpVersion.Version10;
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream(), Encoding.UTF8);
string contstr = sr.ReadToEnd(); //读取的内容
if (res != null)
{
res.Close();
res = null;
}
if (req != null)
{
req.Abort();
req = null;
}
GC.WaitForPendingFinalizers();
GC.Collect();
return contstr;
}
当一两个人访问的时候没有任何问题,但是超过5 6个人就出现以下错误:
The underlying connection was closed: An unexpected error occurred on a send.
在这过程改了好多地方,修改了该修改的属性,设置了最大并发等问题,网络上的方法几乎都用过了,多次测试都没有任何效果。求高手们帮忙看看这究竟是什么问题。
应该是WebRequest这个东西的问题.
推荐直接用webapiclient
没有找到webapiclient相关类,请问怎么使用?
@周明秀: nuget搜索 webapiclient,学习下怎么用。
还是很不错的,比那些久的请求工具都好很多。
没看到StreamReader sr纳入using里面,先试试把这些io资源正确释放再说。
前几天几位大哥在园子里爆怎么写爬虫,好好好读读人家是怎么做的。
你想得太复杂了,其实这个很简单的,你不了解HttpRequest,还乱设置属性,其实只需要这样子写就行了。
public static string GetaouthAccess_token(string appid, string secret, string code) { string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appid, secret, code); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(new Uri(url)); HttpWebResponse res = (HttpWebResponse)req.GetResponse(); using (System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream(), Encoding.UTF8)) { string contstr = sr.ReadToEnd(); //读取的内容 res.Close(); sr.Close(); return contstr; } }
我开了1000个线程 ,总共自执行完大概20秒的时间,你试试吧
谢谢,我试试
@周明秀: 其实时间更少
@田麦成: 我那个用时也不长,自己用开很多线程也不会出问题,就是几个人同时在线上用的时候才出现问题。我一会按照你的这个修改一下看看
@周明秀: 效果怎么样啊?我看看我的代码怎么样
public static string GetaouthAccess_token(string appid, string secret, string code)
问题出在这里,使用了static修饰符,并发访问时,所有访问都走这个方法,如果不做排他处理,会出现异常。去掉static应该就没问题了,每次调用,都生成一个实例,并发访问调用时,多个实例之间就不会相互干扰了。
这些应该是最为简单的问题,多看看书吧 。