HttpClient 不检索 header "Location" 作为响应(而浏览器请求检索)
HttpClient doesn't retrieve header "Location" in response (while the browser request does)
我正在浏览器中执行调用,然后检查内容。 Chrome 告诉我响应 header 包含一个名为 Location 的响应。当我使用 HttpClient
调用同一个 URL 时,我也得到了 header,但它是 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;
我不确定下一步如何trouble-shoot。谷歌搜索确认这是一般情况下的正确方法。显然,与在浏览器中做的相比,我正在做一些不同的事情,但我不能说如何推断出什么,更不用说如何解决它了。
http 客户端使用的处理程序默认自动重定向,并从结果中删除重定向响应 headers。或者您可以说它不会将 header 转发给最终响应。
如果禁用自动重定向,您可以在响应中读取位置 header。您应该自行调用重定向目标,直到获得实际结果。
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.
还有 - 还有一些 useful reading。
我正在浏览器中执行调用,然后检查内容。 Chrome 告诉我响应 header 包含一个名为 Location 的响应。当我使用 HttpClient
调用同一个 URL 时,我也得到了 header,但它是 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;
我不确定下一步如何trouble-shoot。谷歌搜索确认这是一般情况下的正确方法。显然,与在浏览器中做的相比,我正在做一些不同的事情,但我不能说如何推断出什么,更不用说如何解决它了。
http 客户端使用的处理程序默认自动重定向,并从结果中删除重定向响应 headers。或者您可以说它不会将 header 转发给最终响应。 如果禁用自动重定向,您可以在响应中读取位置 header。您应该自行调用重定向目标,直到获得实际结果。
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.
还有 - 还有一些 useful reading。