如何在POST请求后使用WebClient获取Location标头

时间:2018-02-14 11:40:11

标签: c# .net

在成功完成POST请求后,我需要使用WebClient来获取响应头内的url。

但是,执行WebClient.UploadValues后我收到的标题是重定向后页面中的标题。

使用浏览器(红色突出显示我需要的标题): enter image description here

此代码使用WebClient模拟与浏览器中相同的操作:

NameValueCollection formData = new NameValueCollection();
formData["username"] = user;
formData["password"] = password;

byte[] responseBytes = webClient.UploadValues(loginUrl, "POST", formData);
string response = Encoding.UTF8.GetString(responseBytes);

string allheaders = "";
for (int i = 0; i < webClient.ResponseHeaders.Count; i++)
{
    allheaders += Environment.NewLine + webClient.ResponseHeaders.GetKey(i) + " = " + webClient.ResponseHeaders.Get(i);                        
}
File.WriteAllText("headers_2.txt", "[HEADER_2] " + allheaders);

...因此提供了不包含Location标头的headers_2.txt(这些标头来自用户重定向到的页面):

  

[HEADER_2]   Pragma = no-cache   Cache-Control =无存储,无缓存,必须重新验证   日期=星期三,2018年2月14日10:58:10 GMT   Expires = Thu,1981年11月19日08:52:00 GMT   P3P = fffff   Set-Cookie = sid = ffffff;路径= /,gameapi_console = 0;到期=周六,17-Mar-2018 10:58:10 GMT;最大年龄= 2678400;路径= /,bptid = FFFFFF;路径= /   服务器= Apache   Vary = Accept-Encoding,User-Agent   Access-Control-Allow-Origin = *   Content-Type = text / html;字符集= UTF-8   Transfer-Encoding = chunked

如何使用WebClient获取Location标头?如果我能做到的话。

UPDATE:

感谢您的评论。

我忘了展示我的尝试。 所以我创建了自己的继承自WebClient的类。我想如果我在UploadValuesCompleted被解雇的那一刻读到了Headers - 我会在自动重定向之前得到标题。不幸的是,由于未知原因,即使我打电话给webClient.UploadValues(loginUrl, "POST", formData),事件也永远不会被解雇。

class FAWebClient : WebClient
{
    public event Action<string> OnLocationHeaderFound;

    public FAWebClient(Action<string> pOnLocationHeaderFound = null) :base()
    {
        UploadValuesCompleted += OnUploadValuesCompleted;

        if(pOnLocationHeaderFound != null)
            this.OnLocationHeaderFound += pOnLocationHeaderFound;
    }

    protected override void OnUploadValuesCompleted(object sender, UploadValuesCompletedEventArgs e) 
    {
        if (this.OnLocationHeaderFound != null)
        {
            for (int i = 0; i < this.ResponseHeaders.Count; i++)
            {
                System.Diagnostics.Debug.WriteLine(this.ResponseHeaders.GetKey(i) + " = " + this.ResponseHeaders.Get(i));

                if (this.ResponseHeaders.GetKey(i).ToLower() == "location")
                {
                    OnLocationHeaderFound(this.ResponseHeaders.Get(i));
                }
            }
        }

        base.OnUploadValuesCompleted(e);
    }
}

另请注意我使用HttpClient解决了这个问题,只需将HttpClient.AllowAutoRedirect设置为false:

 var handler = new HttpClientHandler()
 {
      AllowAutoRedirect = false
 };

由于我必须在我的应用程序逻辑中进行大量更改,但它确实有效。 但是,如果有人提出解决方案或回答如何使用WebClient来实现该问题,我会保持这个问题的开放性。

1 个答案:

答案 0 :(得分:2)

所以,看起来你已经知道了解决方案 您只需配置WebClient即可使用它 我们假设您的服务器端代码如下所示:

(int *)

您可以像这样创建自定义WebClient:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebApplication12.Controllers
{
    public class HomeController : Controller
    {
        [HttpPost]
        public ActionResult Login(LoginModel credential)
        {
            //code
            Response.Headers.Add("IndexHeader","IndexHeaderValue");
            return RedirectToAction("About");
        }

        public ActionResult About()
        {
            Response.Headers.Add("AboutHeader", "AboutHeaderValue");
            return View();
        }
    }

    public class LoginModel
    {
        public string username { get; set; }
        public string password { get; set; }
    }
}