HttpRequestMessage не добавляет Cookie в запрос - PullRequest
0 голосов
/ 29 июня 2019

Я делаю простой запрос POST через HttpClient из моих консольных приложений

HttpRequestMessage requestMessage = new HttpRequestMessage { Method = method };
requestMessage.Headers.Add("custom1", "c1");
requestMessage.Headers.Add("custom2", "c2");
requestMessage.Headers.Add("Cookie", "c3");
HttpClient client = new HttpClient();
using (var response = await client.SendAsync(requestMessage, cancellationToken))
using (var responseStream = await response.Content.ReadAsStreamAsync())
{
    //...
}

Когда я вижу заголовки запроса в Fiddler , я вижу только первые два заголовка - custom1 и custom2, а заголовок «Cookie» отсутствует.

Я использую VS2017 и .NET 4.7

1 Ответ

2 голосов
/ 30 июня 2019

Не следует добавлять файлы cookie, просто добавив заголовок, потому что есть вещи, которые CookieContainer и HttpCookie будут обрабатывать для вас, такие как срок действия, путь, домен и правильный способ задания имени и значений для файлов cookie.

Лучше всего использовать CookieContainer .

var baseAddress = new Uri('http://localhost');

HttpRequestMessage requestMessage = new HttpRequestMessage { Method = method };
requestMessage.Headers.Add("custom1", "c1");
requestMessage.Headers.Add("custom2", "c2");
// requestMessage.Headers.Add("Cookie", "c3"); wrong way to do it

var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
{
   using(HttpClient client = new HttpClient(handler) { BaseAddress = baseAddress })
   {
       cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
       using (var response = await client.SendAsync(requestMessage, cancellationToken))
       using (var responseStream = await response.Content.ReadAsStreamAsync())
       {
              // do your stuff
       }
   }
}

Не по теме рекомендации :

НЕ создавайте новый экземпляр HttpClient каждый раз. Это приведет к тому, что все сокеты будут заняты. Пожалуйста, следуйте лучшим подходам, таким как singleton или HttpClientFactory .

...