异步http请求问题

时间:2022-07-05 13:48:45
问题说明:我有某论坛账号几千个,我现在需要异步http去验证密码的正确性,
账号,密码作为postdata附加到http请求中,异步回调函数就一个,如何确定请求返回结果是哪一个请求(哪一组账号,密码)所产生的?怎么判断呢。。。。。

15 个解决方案

#1


根据账号匹配账号下的密码。

#2


引用 1 楼 fanyisen 的回复:
根据账号匹配账号下的密码。



怎么判断返回结果是哪一个账号所产生?

#3


你要异步操作的话,必须等待得到回复再进行验证,你用委托方式来实现回调的法你无法控制回调方法的进度的,你最好使用async和await关键字来实现异步,不要用委托的方式来实现异步的,你可以参考这个文章来实现下:
http://www.cnblogs.com/zhili/archive/2013/05/15/Csharp5asyncandawait.html

#4


引用 3 楼 lizhi3186575 的回复:
你要异步操作的话,必须等待得到回复再进行验证,你用委托方式来实现回调的法你无法控制回调方法的进度的,你最好使用async和await关键字来实现异步,不要用委托的方式来实现异步的,你可以参考这个文章来实现下:
http://www.cnblogs.com/zhili/archive/2013/05/15/Csharp5asyncandawait.html





我从网上找了一段代码:


        static void Main(string[] args)
        {
            for (int i = 1; i < 10; i++)
            {
                HttpWebRequest request = WebRequest.Create("http://www.baidu.com") as HttpWebRequest;
                Console.WriteLine("Begin " + DateTime.Now.ToString());
                request.BeginGetResponse(new AsyncCallback(Compleate), request);
                Console.WriteLine("请求" + i + "完成");
            }
            Console.Read();
        }

        static void Compleate(IAsyncResult asyncResult)
        {
            Console.WriteLine("End " + DateTime.Now.ToString());
            Console.WriteLine("异步完成");
            if (asyncResult == null)
            {
                return;
            }
            HttpWebRequest req = (asyncResult.AsyncState as HttpWebRequest);
            HttpWebResponse res = req.EndGetResponse(asyncResult) as HttpWebResponse;
            StreamReader reader = new StreamReader(res.GetResponseStream());
            Console.WriteLine(reader.ReadToEnd());
        }




我应该把账号、密码,我应该在 BeginGetResponse之前设置好账号、密码,还是在回调函数中设置,不太明白 异步http请求原理。。

#5


异步http请求问题 同步方式多线程不行吗?

#6


引用 5 楼 flyer_ren 的回复:
异步http请求问题 同步方式多线程不行吗?



我现在就想异步方式处理。。给解决下

#7


引用 6 楼 cyberarmy 的回复:
我现在就想异步方式处理。。给解决下

代码方面不知道咋解决,异步不知道怎么传个自定义的参数。但具体网站可以具体分析,比如有的网站登录后返回的Cookie中会有登录账号,还有的是先链接网站可以获取SessionID,然后账号密码登录后SessionID是不变的,这样也行,就是麻烦点。或者网站登录后获取用户名来比对下也行。

#8


引用 7 楼 flyer_ren 的回复:
Quote: 引用 6 楼 cyberarmy 的回复:


我现在就想异步方式处理。。给解决下

代码方面不知道咋解决,异步不知道怎么传个自定义的参数。但具体网站可以具体分析,比如有的网站登录后返回的Cookie中会有登录账号,还有的是先链接网站可以获取SessionID,然后账号密码登录后SessionID是不变的,这样也行,就是麻烦点。或者网站登录后获取用户名来比对下也行。





你能明白我的意思,不错了。。 异步http请求问题

#9


返回时可以把账号也放进去。这样的话,账号和验证结果就对应了。

#10


引用 8 楼 cyberarmy 的回复:
你能明白我的意思,不错了。。 异步http请求问题

如果是自己研究的话就慢慢百度找资料吧。或者从回调函数的中的req中解析账号对比。如果是任务的话,同步多线程,几千个用不了几分钟

#11


引用 9 楼 www741147 的回复:
返回时可以把账号也放进去。这样的话,账号和验证结果就对应了。



你是说把账号放到 回调函数参数里?回调函数类型是固定的。

麻烦亲,说清楚点,我愚。。。。

#12


加到Response响应流中

把需要传回去的数据通过Response.Write()方法写入

你再通过res.GetResponseStream()就能取到了

#13


比如说,你可以将参数组合在一起,例如
public class MyRequestSession
{
    public string 账号;
    pulbic HttpWebReeust request;
}

然后在你的 request.BeginGetResponse(new AsyncCallback(Compleate), request); 这里第二个参数传送 MyRequestSession 类型的参数,而不是 request。


也可以完全不用参数,而将委托封装起来。例如
public class MyRequestSession
{
    public string 账号;
    pubic HttpWebReeust request;

    public void Compleate(IAsyncResult asyncResult)
    {
              ............... //这里可以直接从 this.账号 这样的语法取得参数
    }             
}


而调用委托时则是
var session = new MyRequestSession{ 账号=...,
                                                              request= request};
request.BeginGetResponse(session.Compleate, null); 


这两种方式都可以。

#14


设计上第二种方式,基本上就是匿名委托的概念。在使用了lamda表达式之后,匿名委托变成了优雅和精炼的形式:
request.BeginGetResponse(h=>
    {
        //这里写 Compleate 方法内的实现代码,而且可以直接访问 账号、request 等参数,不需要考虑如何传递的问题
    }, null);

#15


其实,请求的时候生成一个ID,传过去,回调时也把ID传回来就是了,就可以一一对应了

#1


根据账号匹配账号下的密码。

#2


引用 1 楼 fanyisen 的回复:
根据账号匹配账号下的密码。



怎么判断返回结果是哪一个账号所产生?

#3


你要异步操作的话,必须等待得到回复再进行验证,你用委托方式来实现回调的法你无法控制回调方法的进度的,你最好使用async和await关键字来实现异步,不要用委托的方式来实现异步的,你可以参考这个文章来实现下:
http://www.cnblogs.com/zhili/archive/2013/05/15/Csharp5asyncandawait.html

#4


引用 3 楼 lizhi3186575 的回复:
你要异步操作的话,必须等待得到回复再进行验证,你用委托方式来实现回调的法你无法控制回调方法的进度的,你最好使用async和await关键字来实现异步,不要用委托的方式来实现异步的,你可以参考这个文章来实现下:
http://www.cnblogs.com/zhili/archive/2013/05/15/Csharp5asyncandawait.html





我从网上找了一段代码:


        static void Main(string[] args)
        {
            for (int i = 1; i < 10; i++)
            {
                HttpWebRequest request = WebRequest.Create("http://www.baidu.com") as HttpWebRequest;
                Console.WriteLine("Begin " + DateTime.Now.ToString());
                request.BeginGetResponse(new AsyncCallback(Compleate), request);
                Console.WriteLine("请求" + i + "完成");
            }
            Console.Read();
        }

        static void Compleate(IAsyncResult asyncResult)
        {
            Console.WriteLine("End " + DateTime.Now.ToString());
            Console.WriteLine("异步完成");
            if (asyncResult == null)
            {
                return;
            }
            HttpWebRequest req = (asyncResult.AsyncState as HttpWebRequest);
            HttpWebResponse res = req.EndGetResponse(asyncResult) as HttpWebResponse;
            StreamReader reader = new StreamReader(res.GetResponseStream());
            Console.WriteLine(reader.ReadToEnd());
        }




我应该把账号、密码,我应该在 BeginGetResponse之前设置好账号、密码,还是在回调函数中设置,不太明白 异步http请求原理。。

#5


异步http请求问题 同步方式多线程不行吗?

#6


引用 5 楼 flyer_ren 的回复:
异步http请求问题 同步方式多线程不行吗?



我现在就想异步方式处理。。给解决下

#7


引用 6 楼 cyberarmy 的回复:
我现在就想异步方式处理。。给解决下

代码方面不知道咋解决,异步不知道怎么传个自定义的参数。但具体网站可以具体分析,比如有的网站登录后返回的Cookie中会有登录账号,还有的是先链接网站可以获取SessionID,然后账号密码登录后SessionID是不变的,这样也行,就是麻烦点。或者网站登录后获取用户名来比对下也行。

#8


引用 7 楼 flyer_ren 的回复:
Quote: 引用 6 楼 cyberarmy 的回复:


我现在就想异步方式处理。。给解决下

代码方面不知道咋解决,异步不知道怎么传个自定义的参数。但具体网站可以具体分析,比如有的网站登录后返回的Cookie中会有登录账号,还有的是先链接网站可以获取SessionID,然后账号密码登录后SessionID是不变的,这样也行,就是麻烦点。或者网站登录后获取用户名来比对下也行。





你能明白我的意思,不错了。。 异步http请求问题

#9


返回时可以把账号也放进去。这样的话,账号和验证结果就对应了。

#10


引用 8 楼 cyberarmy 的回复:
你能明白我的意思,不错了。。 异步http请求问题

如果是自己研究的话就慢慢百度找资料吧。或者从回调函数的中的req中解析账号对比。如果是任务的话,同步多线程,几千个用不了几分钟

#11


引用 9 楼 www741147 的回复:
返回时可以把账号也放进去。这样的话,账号和验证结果就对应了。



你是说把账号放到 回调函数参数里?回调函数类型是固定的。

麻烦亲,说清楚点,我愚。。。。

#12


加到Response响应流中

把需要传回去的数据通过Response.Write()方法写入

你再通过res.GetResponseStream()就能取到了

#13


比如说,你可以将参数组合在一起,例如
public class MyRequestSession
{
    public string 账号;
    pulbic HttpWebReeust request;
}

然后在你的 request.BeginGetResponse(new AsyncCallback(Compleate), request); 这里第二个参数传送 MyRequestSession 类型的参数,而不是 request。


也可以完全不用参数,而将委托封装起来。例如
public class MyRequestSession
{
    public string 账号;
    pubic HttpWebReeust request;

    public void Compleate(IAsyncResult asyncResult)
    {
              ............... //这里可以直接从 this.账号 这样的语法取得参数
    }             
}


而调用委托时则是
var session = new MyRequestSession{ 账号=...,
                                                              request= request};
request.BeginGetResponse(session.Compleate, null); 


这两种方式都可以。

#14


设计上第二种方式,基本上就是匿名委托的概念。在使用了lamda表达式之后,匿名委托变成了优雅和精炼的形式:
request.BeginGetResponse(h=>
    {
        //这里写 Compleate 方法内的实现代码,而且可以直接访问 账号、request 等参数,不需要考虑如何传递的问题
    }, null);

#15


其实,请求的时候生成一个ID,传过去,回调时也把ID传回来就是了,就可以一一对应了