none
HttpWebRequest 导致WebClient超时 RRS feed

  • 问题

  • 因需要在一次登陆的基础上,向web请求一次数据,所以使用HttpWebRequest来实现

     public static string HttpPost(Uri loginuri,Uri uri)
            {
                try
                {
                    CookieContainer cookie = new CookieContainer();
                    HttpWebRequest http = (HttpWebRequest)WebRequest.Create(loginuri);
                    http.AllowAutoRedirect = true;
                    http.Method = "POST";
                    http.Timeout = 5000;
                    http.CookieContainer = cookie;
                    http.GetResponse();
    
                    HttpWebRequest httpcmd = (HttpWebRequest)WebRequest.Create(uri);
                    httpcmd.AllowAutoRedirect = true;
                    httpcmd.Timeout = 5000;
                    httpcmd.CookieContainer = cookie;
                    httpcmd.Method = "POST";
                    httpcmd.GetResponse();
                    return "";
                }
                catch (WebException we)
                {
                    log.Error("HttpPostOverrid => " + we.Message);
                    return "WebException";
                }
                catch (Exception e)
                {
                    log.Error("HttpPostOverrid => " + e.Message);
                    return "";
                }
            }

    可是执行一次成功之后,后面的一直超时,而且另一方法的WebClient对象的DownLoadData也一直超时,屏蔽掉就没问题,请问为什么?

    另:WebClient能实现自动登录并发送请求吗?(能保存Session或者Cookie?)

    2012年4月20日 4:14

答案

  • 你没有用异步方式去拿回复。请尝试

    HttpWebRequest request = HttpWebRequest.Create(url);
    request.BeginGetResponse(new AsyncCallback(ResponseAsync), request);
    
    ...
    
    private async void playResponseAsync(IAsyncResult asyncResult)
    {
    	HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState;
    	try
    	{
    		using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult))
    		{
    ...

    HttpWebRequest 仍有Cookies支持,如你的代码一样。当然你需要将你的 CookieContainer 作为你的全局 CookieContainer。

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 猪宝贝 2012年4月25日 4:31
    2012年4月24日 5:23
    版主

全部回复

  • 你没有用异步方式去拿回复。请尝试

    HttpWebRequest request = HttpWebRequest.Create(url);
    request.BeginGetResponse(new AsyncCallback(ResponseAsync), request);
    
    ...
    
    private async void playResponseAsync(IAsyncResult asyncResult)
    {
    	HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState;
    	try
    	{
    		using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult))
    		{
    ...

    HttpWebRequest 仍有Cookies支持,如你的代码一样。当然你需要将你的 CookieContainer 作为你的全局 CookieContainer。

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 猪宝贝 2012年4月25日 4:31
    2012年4月24日 5:23
    版主
  • 在一次请求后Abort断开,再请求就可以了,Cookie有保存了,已解决,谢谢
    2012年4月25日 4:31