HttpWebResponse.Cookies различного поведения в .net Framework и .net core - PullRequest
0 голосов
/ 26 октября 2018

Я нахожусь в процессе миграции с .net framework на ядро ​​.net и нахожу странную ситуацию с HttpWebRequest / HttpWebResponse: Задача: Необходимо отправить HttpWebRequest по какому-либо адресу с помощью cookie A со значением «fail» и получить cookie A из ответа (но ожидает, что cookie A имеет значение «Ok» в заголовке ответа).Если вы пытаетесь получить cookie из ответа по имени (например, response.Cookies [«A»]), вы получаете «Ok» для .net framework и «fail» для .net core.

Вот пример (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 core:

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

Как я могуПовторите поведение реализации .net Framework HttpWebRequest / HttpWebResponse в ядре .net?

1 Ответ

0 голосов
/ 07 ноября 2018

В 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
    }
}
...