C# HttpClient在重定向时提供等于null的位置(而相应的浏览器调用包含URL)

C# HttpClient在重定向时提供等于null的位置(而相应的浏览器调用包含URL),c#,redirect,.net-core,dotnet-httpclient,.net-core-2.2,C#,Redirect,.net Core,Dotnet Httpclient,.net Core 2.2,我得到一个cookie并使用它,继续模拟相应浏览器步骤给出的步骤。由于自动重定向已关闭,我必须单独执行每个步骤,在下一步中使用它获取响应头中的位置。在三次这样的操作之后,响应的头包含位置字段,但它是空的。使用浏览器执行相应操作时,在每个重定向步骤中都包含一个实际位置 private static Uri ObtainExecutor(Uri referer, Uri uri, Cookie cookie) { CookieContainer cookieJar = new CookieCon

我得到一个cookie并使用它,继续模拟相应浏览器步骤给出的步骤。由于自动重定向已关闭,我必须单独执行每个步骤,在下一步中使用它获取响应头中的位置。在三次这样的操作之后,响应的头包含位置字段,但它是空的。使用浏览器执行相应操作时,在每个重定向步骤中都包含一个实际位置

private static Uri ObtainExecutor(Uri referer, Uri uri, Cookie cookie)
{
  CookieContainer cookieJar = new CookieContainer();
  cookieJar.Add(cookie);
  HttpClientHandler handler = new HttpClientHandler
  {
    CookieContainer = cookieJar,
    AllowAutoRedirect = false
  };
  HttpClient client = new HttpClient(handler);
  client.DefaultRequestHeaders.Referrer = referer;
  client.DefaultRequestHeaders.Host = uri.Host;

  HttpResponseMessage response = client.GetAsync(uri).Result;
  HttpResponseHeaders headers = response.Headers;
  return new Uri(uri, response.Headers.Location);
}
我不知道如何进一步排除故障。我比较了标题,没有发现任何关联。我用同样的结果把它切碎了,无法抓住即将到来的过载包。当然,我也用谷歌搜索了一个多星期

我确信在调用的执行方式上有微小的差别,但我缺乏看到它的能力。下面的示例连接到实际服务器,并显示缺少重定向位置的位置。(我对大样本表示歉意——我试图将其最小化,但确保不遗漏我不清楚的相关细节。)

类程序
{
静态void Main(字符串[]参数)
{
常量字符串url=”https://www.pensionsmyndigheten.se/service/login/login"
+“?目标页面=https://www.pensionsmyndigheten.se/service/overview/"
+“&失败页面=https://www.pensionsmyndigheten.se/service/login/error/login-failed"
+“&取消页面=https://www.pensionsmyndigheten.se/";
Uri=新的Uri(url);
Cookie Cookie=生成Cookie(uri);
Uri发现=发现服务(cookie);
Uri执行=获取执行器(Uri、发现、cookie);
Uri对话=获取对话(Uri、执行、cookie);
}
私有静态Cookie GenerateCookie(Uri)
{
CookieContainer cookieJar=新CookieContainer();
HttpClientHandler handler=newhttpclienthandler{CookieContainer=cookieJar};
HttpClient=新的HttpClient(处理程序);
HttpResponseMessageResponse=client.GetAsync(uri).Result;
HttpContent=response.content;
Cookie Cookie=cookieJar.GetCookies(uri)
.Cast()
.First(e=>e.Name==“pm_-retention_-url”);
返回cookie;
}
私有静态Uri发现服务(Cookie)
{
字符串url=”https://www.pensionsmyndigheten.se/service/login/discoresponse"
+“?spId=默认值”
+“&entityID=https%3A%2F%2Feid.legideringstjanst.se%2fmobilet bankid%2F”;
Uri=新的Uri(url);
CookieContainer cookieJar=新CookieContainer();
添加(cookie);
HttpClientHandler处理程序=新的HttpClientHandler
{
CookieContainer=cookieJar,
AllowAutoRedirect=false
};
HttpClient=新的HttpClient(处理程序);
client.DefaultRequestHeaders.referer=uri;
client.DefaultRequestHeaders.Host=uri.Host;
HttpResponseMessageResponse=client.GetAsync(uri).Result;
HttpResponseHeaders headers=response.headers;
返回标题。位置;
}
私有静态Uri获取执行器(Uri引用器、Uri Uri、Cookie Cookie)
{
CookieContainer cookieJar=新CookieContainer();
添加(cookie);
HttpClientHandler处理程序=新的HttpClientHandler
{
CookieContainer=cookieJar,
AllowAutoRedirect=false
};
HttpClient=新的HttpClient(处理程序);
client.DefaultRequestHeaders.referer=referer;
client.DefaultRequestHeaders.Host=uri.Host;
HttpResponseMessageResponse=client.GetAsync(uri).Result;
HttpResponseHeaders headers=response.headers;
返回新的Uri(Uri,response.Headers.Location);
}
私有静态Uri获取会话(Uri引用器、Uri Uri、Cookie Cookie)
{
CookieContainer cookieJar=新CookieContainer();
添加(cookie);
HttpClientHandler处理程序=新的HttpClientHandler
{
CookieContainer=cookieJar,
AllowAutoRedirect=false
};
HttpClient=新的HttpClient(处理程序);
client.DefaultRequestHeaders.referer=referer;
client.DefaultRequestHeaders.Host=uri.Host;
HttpResponseMessageResponse=client.GetAsync(uri).Result;
HttpResponseHeaders headers=response.headers;
//找出返回的重定向URL为空的原因。
Uri重定向=headers.Location;
//它应该包含以下值。
重定向=新Uri(
"https://idpproxy.pensionsmyndigheten.se/idp/Authn/SamlSP?conversation=e1s1");
返回重定向;
}
}

我看不到发生重定向。如果将
AllowAutoRedirect
设置为true,则响应的内容相同。我只是认为您的代码已经完成,您已经准备好使用会话cookie进行请求了。@Silvermind!但是,当我在浏览器中手动执行操作时,网络请求列表显然会生成一个位置设置为某物的标题。我已经关闭了所有站点的JS,以确保使用HttpClient时遵循相同的步骤。我怀疑的是,其中一个调用在我缺少的某些细节上有所不同,因此在稍后的阶段会在其中一个服务器上产生不同的结果。我认为完全相同的请求应该产生完全相同的结果。有没有关于如何推断这一点的提示?我就要放弃了。:)我不知道。也许您可以重新启用重定向并检查fiddler或类似的东西来查看发生了什么。
class Program
{
  static void Main(string[] args)
  {
    const 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);

    Cookie cookie = GenerateCookie(uri);
    Uri discovery = DiscoverService(cookie);
    Uri execution = ObtainExecutor(uri, discovery, cookie);
    Uri conversation = ObtainConversor(uri, execution, cookie);
  }

  private static Cookie GenerateCookie(Uri uri)
  {
    CookieContainer cookieJar = new CookieContainer();
    HttpClientHandler handler = new HttpClientHandler { CookieContainer = cookieJar };
    HttpClient client = new HttpClient(handler);

    HttpResponseMessage response = client.GetAsync(uri).Result;
    HttpContent content = response.Content;

    Cookie cookie = cookieJar.GetCookies(uri)
      .Cast<Cookie>()
      .First(e => e.Name == "pm_retention_urls");

    return cookie;
  }

  private static Uri DiscoverService(Cookie cookie)
  {
    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,
      AllowAutoRedirect = false
    };
    HttpClient client = new HttpClient(handler);
    client.DefaultRequestHeaders.Referrer = uri;
    client.DefaultRequestHeaders.Host = uri.Host;

    HttpResponseMessage response = client.GetAsync(uri).Result;
    HttpResponseHeaders headers = response.Headers;

    return headers.Location;
  }

  private static Uri ObtainExecutor(Uri referer, Uri uri, Cookie cookie)
  {
    CookieContainer cookieJar = new CookieContainer();
    cookieJar.Add(cookie);
    HttpClientHandler handler = new HttpClientHandler
    {
      CookieContainer = cookieJar,
      AllowAutoRedirect = false
    };
    HttpClient client = new HttpClient(handler);
    client.DefaultRequestHeaders.Referrer = referer;
    client.DefaultRequestHeaders.Host = uri.Host;

    HttpResponseMessage response = client.GetAsync(uri).Result;
    HttpResponseHeaders headers = response.Headers;
    return new Uri(uri, response.Headers.Location);
  }

  private static Uri ObtainConversor(Uri referer, Uri uri, Cookie cookie)
  {
    CookieContainer cookieJar = new CookieContainer();
    cookieJar.Add(cookie);
    HttpClientHandler handler = new HttpClientHandler
    {
      CookieContainer = cookieJar,
      AllowAutoRedirect = false
    };
    HttpClient client = new HttpClient(handler);
    client.DefaultRequestHeaders.Referrer = referer;
    client.DefaultRequestHeaders.Host = uri.Host;

    HttpResponseMessage response = client.GetAsync(uri).Result;
    HttpResponseHeaders headers = response.Headers;

    // Figure out why the returned redirection URL is empty.
    Uri redirection = headers.Location;
    // It should be containing the following value.
    redirection = new Uri(
      "https://idpproxy.pensionsmyndigheten.se/idp/Authn/SamlSP?conversation=e1s1");

    return redirection;
  }
}