c# - HttpClient 不会在响应中检索标头“Location”(而浏览器请求会)
问题描述
我正在浏览器中执行调用,然后检查内容。Chrome 告诉我响应标头包含一个名为Location的标头。当我使用 执行对同一 URL 的调用时HttpClient
,我也得到了标头,但它是null
. 我没有信心判断是我遗漏了什么,或者HttpClient
实例的操作方式与浏览器的操作方式是否存在差异。
首先,我得到了允许我在目标页面识别自己的 cookie。
string url = "https://www.pensionsmyndigheten.se/service/login/login"
+ "?targetPage=https://www.pensionsmyndigheten.se/service/overview/"
+ "&failurePage=https://www.pensionsmyndigheten.se/service/login/error/login-failed"
+ "&cancelPage=https://www.pensionsmyndigheten.se/";
Uri uri = new Uri(url);
CookieContainer cookieJar = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler { CookieContainer = cookieJar };
HttpClient client = new HttpClient(handler);
HttpResponseMessage result = client.GetAsync(uri).Result;
Cookie cookie = cookieJar.GetCookies(uri).First(e => e.Name == "pm_retention_urls");
然后,使用此 cookie,我尝试获取允许我发送授权请求的 SAML 查询字符串。
string url = "https://www.pensionsmyndigheten.se/service/login/discoresponse"
+ "?spId=default"
+ "&entityID=https%3A%2F%2Feid.legitimeringstjanst.se%2Fmobilt-bankid%2F";
Uri uri = new Uri(url);
CookieContainer cookieJar = new CookieContainer();
cookieJar.Add(cookie);
HttpClientHandler handler = new HttpClientHandler { CookieContainer = cookieJar };
HttpClient client = new HttpClient(handler);
client.DefaultRequestHeaders.Referrer = uri;
HttpResponseMessage response = client.GetAsync(uri).Result;
HttpResponseHeaders headers = response.Headers;
我不确定下一步如何解决它。谷歌搜索确认这是一般情况下的正确方法。显然,与在浏览器中做的事情相比,我做了一些不同的事情,但我不能说如何推断出什么,更不用说如何解决它了。
解决方案
http 客户端使用的处理程序默认自动重定向,并从结果中删除重定向响应标头。或者您可以说它不会将标头转发到最终响应。如果禁用自动重定向,则可以读取响应中的位置标头。您应该注意自己调用重定向目标,直到获得实际结果。
var handler = new HttpClientHandler
{
CookieContainer = cookieJar,
AllowAutoRedirect = false
};
HttpClient client = new HttpClient(handler);
client.DefaultRequestHeaders.Referrer = uri;
var response = client.GetAsync(uri).Result;
var location = response.Headers["Location"];
// Call the get operation on the location url to continue.
另外——一些更有用的读物。
推荐阅读
- mysql - 如何将所有数据库导出为单独的 sql 文件而不是 localhost.sql
- symfony - 获取具有键和值的数组作为我在 DQL 中的选择属性
- python - 设置时出现 wxpython 错误 - ModuleNotFound:没有名为“wx”的模块
- sql - 如何在 Oracle SQL 中添加一个检查总和的约束?
- stripe-payments - Stripe Connect 更新关联账户
- micronaut - 无法在 Windows 10 上安装 micronaut
- python - 仅打印底部字符串
- java - 如何使用以下代码获得更好的性能
- f# - F# - 如何使用 fsunit 测试构造函数中引发的异常?
- api - 有没有办法使用 Tasks API 在 Google Tasks 上捕获时间。新版谷歌任务可以捕捉时间并创建递归提醒