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 

使用下面的代码发出post请求时,它没有发出浏览器正在执行的自动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 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请求。 [在浏览器中自动生成]

鉴于HttpWebRequest不是浏览器,这应该不足为奇。 如果您需要执行这些重定向,请检查HttpWebResponse.StatusCode ,如果它是300的重定向代码,则发出另一个请求。 请注意10.3重定向3xx下的链接:

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

尝试添加

 request.AllowAutoRedirect = true; 

就在

 var request = base.GetWebRequest(address); 

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