Я работаю над приложением 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