Я нахожусь в процессе миграции из .net framework в .net core и обнаружил странную ситуацию с HttpWebRequest / HttpWebResponse: Задача: необходимо отправить HttpWebRequest на какой-либо адрес с cookie A со значением «fail» и получить cookie A из ответа (но ожидается, что cookie A имеет значение «Ok» в заголовке ответа). Если вы пытаетесь получить cookie из ответа по имени (например, response.Cookies [«A»]), вы получите «Ok» для .net framework и «fail» для ядра .net.
Вот пример (1p_JAR содержится в запросе и ответе):
CookieContainer cookieContainer = new CookieContainer();
Uri uri = new Uri("https://google.com");
cookieContainer.SetCookies(uri, "k1=1111,k2=2222,k3=3333,1P_JAR=zzz");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.CookieContainer = cookieContainer;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Console.WriteLine("Cookies from response: ");
foreach (Cookie cookie in response.Cookies)
{
Console.WriteLine(" " + cookie.Name + ": " + cookie.Value);
}
Console.WriteLine("Get cookie by name: " + response.Cookies["1P_JAR"]);
Результат для .net framework:
Cookies from response:
1P_JAR: 2018-10-26-13
NID: bla-bla-bla
Get cookie by name: 1P_JAR=2018-10-26-13
Результат из ядра .net:
Cookies from response:
k1: 1111
k2: 2222
k3: 3333
1P_JAR: zzz
1P_JAR: 2018-10-26-13
NID: bla-bla-bla
Get cookie by name: 1P_JAR=zzz
Как я могу повторить поведение реализации HttpWebRequest / HttpWebResponse в .NET framework в ядре .net?





В github была создана проблема: https://github.com/dotnet/corefx/issues/33122
Решение, которое работает для .net core и .net framework:
public static class HttpWebResponseGetCookiesExtension
{
public static CookieCollection GetResponseCookies(this HttpWebResponse response)
{
#if NETCOREAPP
var cookieContainer = new CookieContainer();
string cookieHeader = response.Headers[HttpResponseHeader.SetCookie] ?? string.Empty;
cookieContainer.SetCookies(response.ResponseUri, cookieHeader);
return cookieContainer.GetCookies(response.ResponseUri);
#else
return response.Cookies;
#endif
}
}