在成功完成POST请求后,我需要使用WebClient
来获取响应头内的url。
但是,执行WebClient.UploadValues
后我收到的标题是重定向后页面中的标题。
此代码使用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标头?如果我能做到的话。
感谢您的评论。
我忘了展示我的尝试。
所以我创建了自己的继承自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
来实现该问题,我会保持这个问题的开放性。
答案 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; }
}
}