WebClient不会自动重定向

时间:2012-10-23 20:54:10

标签: c# webclient

使用Firebug登录登录过程时,我发现它就像这样

POST //The normal post request
GET //Automatically made after the login
GET //Automatically made after the login
GET //Automatically made after the login

使用下面的代码发布帖子请求时,它没有发出浏览器正在执行的自动GET请求。

我的WebClient处理程序

using System;
using System.Net;

namespace Test
{
    class HttpHandler : WebClient
    {
        private CookieContainer _mContainer = new CookieContainer();

        protected override WebRequest GetWebRequest(Uri address)
        {
            var request = base.GetWebRequest(address);
            if (request is HttpWebRequest)
            {
                (request as HttpWebRequest).CookieContainer = _mContainer;
            }
            return request;
        }

        protected override WebResponse GetWebResponse(WebRequest request)
        {
            var response = base.GetWebResponse(request);
            if (response is HttpWebResponse)
                _mContainer.Add((response as HttpWebResponse).Cookies);
            return response;
        }

        public void ClearCookies()
        {
            _mContainer = new CookieContainer();
        }
    }
}

使用代码

private static async Task<byte[]> LoginAsync(string username, string password)
{
    var postData = new NameValueCollection();
    var uri = new Uri(string.Format("http://{0}/", ServerName));

    postData.Add("name", username);
    postData.Add("password", password);

    return await HttpHandler.UploadValuesTaskAsync(uri, postData);
}

当尝试跟踪我的应用程序的连接时,它只执行POST请求而不是其余的GET请求。 [在浏览器中自动生成]

2 个答案:

答案 0 :(得分:10)

尝试添加

request.AllowAutoRedirect = true;

下的

var request = base.GetWebRequest(address);

它为我解决了一些类似的问题,即使默认情况下autoredirect应该是ON。

答案 1 :(得分:2)

鉴于HttpWebRequest不是浏览器,这应该不足为奇。如果您需要执行这些重定向,请检查HttpWebResponse.StatusCode,如果它是redirect code in the 300's,请再次发出请求。请注意10.3重定向3xx下的链接:

  

此类状态代码表示用户代理需要采取进一步操作才能完成请求。当且仅当第二个请求中使用的方法是GET或HEAD时,所需的操作可以由用户代理执行而不与用户交互。客户端应该检测无限重定向循环,因为这样的循环会为每个重定向生成网络流量。