首页 新闻 会员 周边

求高手解决.net访问网络并发错误问题

0
悬赏园豆:100 [待解决问题]

最近做在一个一个项目,需要访问微信接口。下面是我的代码:

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.

在这过程改了好多地方,修改了该修改的属性,设置了最大并发等问题,网络上的方法几乎都用过了,多次测试都没有任何效果。求高手们帮忙看看这究竟是什么问题。

周明秀的主页 周明秀 | 初学一级 | 园豆:102
提问于:2015-08-10 17:53
< >
分享
所有回答(4)
0

应该是WebRequest这个东西的问题.

推荐直接用webapiclient

吴瑞祥 | 园豆:29449 (高人七级) | 2015-08-10 18:15

没有找到webapiclient相关类,请问怎么使用?

支持(0) 反对(0) 周明秀 | 园豆:102 (初学一级) | 2015-08-10 18:35

@周明秀: nuget搜索 webapiclient,学习下怎么用。

还是很不错的,比那些久的请求工具都好很多。

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2015-08-10 19:49
0

没看到StreamReader  sr纳入using里面,先试试把这些io资源正确释放再说。

前几天几位大哥在园子里爆怎么写爬虫,好好好读读人家是怎么做的。

arg | 园豆:1047 (小虾三级) | 2015-08-11 00:21
0

你想得太复杂了,其实这个很简单的,你不了解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秒的时间,你试试吧

需要格局 | 园豆:2145 (老鸟四级) | 2015-08-11 14:02

谢谢,我试试

支持(0) 反对(0) 周明秀 | 园豆:102 (初学一级) | 2015-08-11 14:07

@周明秀: 其实时间更少

支持(0) 反对(0) 需要格局 | 园豆:2145 (老鸟四级) | 2015-08-11 14:08

@田麦成: 我那个用时也不长,自己用开很多线程也不会出问题,就是几个人同时在线上用的时候才出现问题。我一会按照你的这个修改一下看看

支持(0) 反对(0) 周明秀 | 园豆:102 (初学一级) | 2015-08-11 14:10

@周明秀: 效果怎么样啊?我看看我的代码怎么样

支持(0) 反对(0) 需要格局 | 园豆:2145 (老鸟四级) | 2015-08-12 09:02
0

public static string GetaouthAccess_token(string appid, string secret, string code)

 

问题出在这里,使用了static修饰符,并发访问时,所有访问都走这个方法,如果不做排他处理,会出现异常。去掉static应该就没问题了,每次调用,都生成一个实例,并发访问调用时,多个实例之间就不会相互干扰了。

 

这些应该是最为简单的问题,多看看书吧 。

牧师/preacher | 园豆:500 (菜鸟二级) | 2015-08-20 10:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册