Я работаю над приложением C#, которое отправляет HTTP-запросы на сервер для проверки доступных дат с помощью HttpClient. У меня есть два разных подхода к настройке заголовков запроса, но работает только один из них. Другой подход возвращает ошибку 404.
Вот упрощенная версия моего кода для контекста.
Рабочий код< /p>
Этот код устанавливает заголовки с использованием sessionHeaders и дополнительных заголовков:
private Dictionary ExtractHeaders(HttpResponseMessage response)
{
var cookies = ExtractRelevantCookies(response);
var html = response.Content.ReadAsStringAsync().Result;
// Parse HTML to extract the CSRF token
var doc = new HtmlDocument();
doc.LoadHtml(html);
var csrfTokenNode = doc.DocumentNode.SelectSingleNode("//meta[@name='csrf-token']");
var csrfToken = csrfTokenNode?.Attributes["content"].Value;
var baseUri = some url;
// Return the headers as a dictionary
return new Dictionary
{
{ "Cookie", cookies },
{ "X-CSRF-Token", csrfToken },
{ "Referer", baseUri },
{ "Referrer-Policy", "strict-origin-when-cross-origin" },
{ "User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" },
{ "Cache-Control", "no-store" },
{ "Connection", "keep-alive" }
};
}
private async Task CheckDate(Dictionary sessionHeaders)
{
var url = $"{some url}";
_httpClient.DefaultRequestHeaders.Clear();
AddHeaders(sessionHeaders, _httpClient);
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_httpClient.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");
var response = await _httpClient.GetAsync(url);
var responseData = await response.Content.ReadAsStringAsync();
return null;
}
Нерабочий код
Во втором подходе я устанавливаю заголовки вручную через DefaultRequestHeaders, но это приводит к ошибке http 404:
private Dictionary ExtractHeaders(HttpResponseMessage response)
{
var cookies = ExtractRelevantCookies(response);
var html = response.Content.ReadAsStringAsync().Result;
var doc = new HtmlDocument();
doc.LoadHtml(html);
var csrfTokenNode = doc.DocumentNode.SelectSingleNode("//meta[@name='csrf-token']");
var csrfToken = csrfTokenNode?.Attributes["content"].Value;
return new Dictionary
{
{ "Cookie", cookies },
{ "X-CSRF-Token", csrfToken }
};
}
private async Task CheckDate(Dictionary sessionHeaders)
{
var url = $"some url";
_httpClient.DefaultRequestHeaders.Clear();
// Manually add sessionHeaders
foreach (var header in sessionHeaders)
{
_httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
}
// Add additional headers
_httpClient.DefaultRequestHeaders.Add("Referrer", some url);
_httpClient.DefaultRequestHeaders.Add("Referrer-Policy", "strict-origin-when-cross-origin");
_httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36");
_httpClient.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue { NoStore = true };
_httpClient.DefaultRequestHeaders.Connection.Add("keep-alive");
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_httpClient.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");
var response = await _httpClient.GetAsync(url);
var responseData = await response.Content.ReadAsStringAsync();
return null;
}
Единственное различие между этими двумя подходами заключается в том, как я добавляю заголовки из sessionHeaders. В обоих случаях «Cookie» включается в sessionHeaders.
При использовании первого подхода (AddHeaders), все работает как положено. Но при втором подходе, когда я добавляю заголовки вручную, я получаю ошибку http 404.
Что может быть причиной ошибки 404 при втором подходе? Существуют ли какие-либо потенциальные ошибки при настройке заголовков вручную в HttpClient?
private string ExtractRelevantCookies(HttpResponseMessage
response)
{
var cookies = response.Headers.GetValues("Set-Cookie");
var parsedCookies = ParseCookies(cookies);
return $"session={parsedCookies["session_session"]}";
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... ng-headers
C# HttpClient: почему мой запрос возвращает ошибку 404 после установки заголовков из sessionHeaders? ⇐ C#
Место общения программистов C#
1727888933
Anonymous
Я работаю над приложением C#, которое отправляет HTTP-запросы на сервер для проверки доступных дат с помощью HttpClient. У меня есть два разных подхода к настройке заголовков запроса, но работает только один из них. Другой подход возвращает ошибку 404.
Вот упрощенная версия моего кода для контекста.
[b]Рабочий код[/b]< /p>
Этот код устанавливает заголовки с использованием sessionHeaders и дополнительных заголовков:
private Dictionary ExtractHeaders(HttpResponseMessage response)
{
var cookies = ExtractRelevantCookies(response);
var html = response.Content.ReadAsStringAsync().Result;
// Parse HTML to extract the CSRF token
var doc = new HtmlDocument();
doc.LoadHtml(html);
var csrfTokenNode = doc.DocumentNode.SelectSingleNode("//meta[@name='csrf-token']");
var csrfToken = csrfTokenNode?.Attributes["content"].Value;
var baseUri = some url;
// Return the headers as a dictionary
return new Dictionary
{
{ "Cookie", cookies },
{ "X-CSRF-Token", csrfToken },
{ "Referer", baseUri },
{ "Referrer-Policy", "strict-origin-when-cross-origin" },
{ "User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" },
{ "Cache-Control", "no-store" },
{ "Connection", "keep-alive" }
};
}
private async Task CheckDate(Dictionary sessionHeaders)
{
var url = $"{some url}";
_httpClient.DefaultRequestHeaders.Clear();
AddHeaders(sessionHeaders, _httpClient);
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_httpClient.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");
var response = await _httpClient.GetAsync(url);
var responseData = await response.Content.ReadAsStringAsync();
return null;
}
[b]Нерабочий код[/b]
Во втором подходе я устанавливаю заголовки вручную через DefaultRequestHeaders, но это приводит к ошибке http 404:
private Dictionary ExtractHeaders(HttpResponseMessage response)
{
var cookies = ExtractRelevantCookies(response);
var html = response.Content.ReadAsStringAsync().Result;
var doc = new HtmlDocument();
doc.LoadHtml(html);
var csrfTokenNode = doc.DocumentNode.SelectSingleNode("//meta[@name='csrf-token']");
var csrfToken = csrfTokenNode?.Attributes["content"].Value;
return new Dictionary
{
{ "Cookie", cookies },
{ "X-CSRF-Token", csrfToken }
};
}
private async Task CheckDate(Dictionary sessionHeaders)
{
var url = $"some url";
_httpClient.DefaultRequestHeaders.Clear();
// Manually add sessionHeaders
foreach (var header in sessionHeaders)
{
_httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
}
// Add additional headers
_httpClient.DefaultRequestHeaders.Add("Referrer", some url);
_httpClient.DefaultRequestHeaders.Add("Referrer-Policy", "strict-origin-when-cross-origin");
_httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36");
_httpClient.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue { NoStore = true };
_httpClient.DefaultRequestHeaders.Connection.Add("keep-alive");
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_httpClient.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");
var response = await _httpClient.GetAsync(url);
var responseData = await response.Content.ReadAsStringAsync();
return null;
}
Единственное различие между этими двумя подходами заключается в том, как я добавляю заголовки из sessionHeaders. В обоих случаях «Cookie» включается в sessionHeaders.
При использовании первого подхода (AddHeaders), все работает как положено. Но при втором подходе, когда я добавляю заголовки вручную, я получаю ошибку http 404.
Что может быть причиной ошибки 404 при втором подходе? Существуют ли какие-либо потенциальные ошибки при настройке заголовков вручную в HttpClient?
private string ExtractRelevantCookies(HttpResponseMessage
response)
{
var cookies = response.Headers.GetValues("Set-Cookie");
var parsedCookies = ParseCookies(cookies);
return $"session={parsedCookies["session_session"]}";
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79044868/c-sharp-httpclient-why-does-my-request-return-a-404-error-after-setting-headers[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия