#c# #cookies #httpclient #windows-phone-8.1
#c# #файлы cookie #httpclient #windows-phone-8.1
Вопрос:
Я использую HttpClient
in theSystem.Net.Http
, но у меня возникают проблемы с файлами cookie. Я прочитал другие сообщения, объясняющие, как настроить cookies с помощью HttpClient.
I create a CookieContainer
для HttpClientHandler.CookieHandler
и использовать этот контейнер для cookies. При инициализации его значение, очевидно, равно 0, а после создания PostAsync
оно CookieContainer
содержит один файл cookie. Я выполняю foreach
цикл для печати значений и получаю значение одного файла cookie. Похоже, что все работает так, как должно.
Проблема в том, что, хотя кажется, что я принимаю cookies, веб-сайт перенаправляет меня на страницу, информирующую меня о том, что я не принимаю cookies. Я проверил с помощью браузера (чтобы он не принимал cookies), и это точный результат, который я получаю с моим HttpClient
.
Общая функция моего кода — выдавать значения для входа в систему и пытаться опубликовать их. Кажется, что вход в систему работает должным образом, хотя он перенаправляет меня, сообщая, что я не принимаю cookies, хотя мой CookieContainer
файл cookie действительно содержит. Я не уверен, где это пошло не так, но, похоже, веб-сайт не видит, что я на самом деле принимаю cookies. Я пробовал настраивать httpClientHandler.UseCookies = true;
, но без какой-либо разницы. Веб-сайт, к которому я пытаюсь получить доступ, — это система чтения оценок моего университета, и у меня нет доступа к какой-либо ее кодировке.
Мой код показан ниже:
{
var httpClientHandler = new HttpClientHandler();
//Creating cookiecontainer and printing Count for debug purpose
var cookieContainer = new CookieContainer();
Debug.WriteLine("Cookies " cookieContainer.Count);
httpClientHandler.CookieContainer = cookieContainer;
var httpClient = new HttpClient(httpClientHandler);
HttpResponseMessage response = await httpClient.PostAsync(url, new FormUrlEncodedContent(values));
Debug.WriteLine("Response code" response.StatusCode);
Debug.WriteLine("Response: " response.IsSuccessStatusCode);
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();
//Print amount of cookies after PostAsync - Should contain cookie now
Debug.WriteLine("Cookies " cookieContainer.Count);
//Printing the values of the added cookies
foreach (Cookie cookie in cookieContainer.GetCookies(new Uri(url)))
{
Debug.WriteLine("Cookie contains: " cookie.Value.ToString());
}
}
Это мое первое приложение для Windows Phone, и я впервые использую HttpClient
, но я уже несколько дней читаю об этом, поэтому надеюсь, что ответ не слишком очевиден. Большое вам спасибо — мы очень ценим вашу помощь.
Ответ №1:
Я решил проблему, отслеживая веб-сайт с помощью Chrome. Я понял, что страница входа выдавала мне 2 cookie-файла при первом переходе на страницу и 1 cookie-файл при входе в систему. Сценарий может быть описан следующим образом
- Получить файлы cookie LoginPage — 2
- Опубликовать страницу входа — 1 файл cookie
Проблема заключалась в том, что я начал с того, что сделал httpClient.PostAsync
для входа в систему. При выполнении входа в систему у меня отсутствовали первые 2 cookies.
Я решил это, выполнив HttpClient.Получите синхронизацию перед публикацией, затем я получил всего 3 файла cookie, которые были необходимы.
HttpResponseMessage responseGet = await httpClient.GetAsync(User.School.Url);
HttpResponseMessage responsePost = await httpClient.PostAsync(User.School.Url, new FormUrlEncodedContent(values));
Вероятно, проблема была вызвана моим недостатком знаний о файлах cookie. Если в ответе веб-сайта говорится, что у вас отсутствуют файлы cookie, то, вероятно, так оно и есть, убедитесь, что вы правильно отследили ВЕСЬ трафик. Надеюсь, это может быть полезно кому-то еще 🙂