我正在浏览器中执行呼叫,然后检查内容。 Chrome告诉我,响应标头包含一个称为 Location 的标头。当我使用HttpClient
执行对相同URL的调用时,我也获得了标头,但它是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;
我不确定下一步如何解决它。谷歌搜索确认这是一般情况下的正确方法。显然,与在浏览器中相比,我正在做一些不同的事情,但是我不能说如何推断出什么,更不用说如何解决它了。
答案 0 :(得分:1)
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.
也-还有useful reading。