C# HttpClient: почему мой запрос возвращает ошибку 404 после установки заголовков из sessionHeaders?C#

Место общения программистов C#
Ответить
Anonymous
 C# HttpClient: почему мой запрос возвращает ошибку 404 после установки заголовков из sessionHeaders?

Сообщение Anonymous »

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

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»