Как хранить файлы cookie с помощью HttpClient в C#? - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь передать некоторые данные из моего приложения в конкретную веб-службу c с помощью HttpClient. Для этого мне сначала нужно войти в веб-службу и получить повар ie (это метод аутентификации, используемый веб-службой). У меня так:

Uri uri = "login_uri";
CookieContainer CookieContainer_login = new CookieContainer();
HttpClientHandler ch = new HttpClientHandler
{
   AllowAutoRedirect = true,
   CookieContainer = CookieContainer_login,
   UseCookies = true
};
HttpClient client = new HttpClient(ch);
List<KeyValuePair<string, string>> pairs = new List<KeyValuePair<string, string>>
{
   new KeyValuePair<string, string>("user", "test"),
   new KeyValuePair<string, string>("password", "test"),
   new KeyValuePair<string, string>("loginSource", "0")
};
FormUrlEncodedContent content = new FormUrlEncodedContent(pairs);
System.Threading.Tasks.Task<HttpResponseMessage> response = client.PostAsync(uri, content);

Работает, получаю сообщение об успешном входе через Fiddler. Теперь, чтобы использовать веб-службу (другой Uri), например, для отправки запроса POST, я должен передать свои файлы cookie (полученные во время процесса входа) в этот запрос. Поскольку я храню файлы cookie в CookieContainer под названием CookieContainer_login, я подумал, что могу просто использовать тот же клиент и изменить только Uri в методе PostAsyn c или создать нового клиента с теми же HttpClientHandler и CookieContainer. К сожалению, это не сработало. Фактически, я обнаружил, что мой CookieContainer пуст даже после входа в систему.

Я попытался воссоздать это с помощью HttpWebRequest вот так:

string url_login = "login_uri";
string logparam = "user=test&password=test&loginSource=0";
HttpWebRequest loginRequest = (HttpWebRequest)WebRequest.Create(url_login);
loginRequest.ContentType = "application/x-www-form-urlencoded";
loginRequest.Accept = "text/xml";
loginRequest.Method = "POST";
loginRequest.CookieContainer = CookieContainer_login;

byte[] byteArray = Encoding.UTF8.GetBytes(logparam);

loginRequest.ContentLength = byteArray.Length;

Stream dataStream_login = loginRequest.GetRequestStream();
dataStream_login.Write(byteArray, 0, byteArray.Length);

Это работает, я также получаю сообщение об успешном входе в систему, но также когда я проверяю счетчик CookieContainer, он показывает 3 файла cookie, которые сохраняются после входа в систему. Теперь мой вопрос: почему с HttpClient в CookieContainer нет файлов cookie, а с HttpWebRequest есть? Как получить файлы cookie с помощью HttpClient?

1 Ответ

0 голосов
/ 29 мая 2020

Хорошо, мне удалось решить мою проблему, и, надеюсь, мой ответ будет полезен кому-то с аналогичной проблемой. В моем случае ошибка была в вызове метода PostAsyn c. Это асинхронный метод, поэтому ему нужен оператор await, которого мне не хватало. Правильный вызов метода должен выглядеть так:

HttpResponseMessage response = new HttpResponseMessage(); response = await client.PostAsync(uri, content);

Теперь все файлы cookie хранятся в моем CookieContainer.

...