Заголовок заголовка прошивки HTTP-прокси требует кукурузы
Я пытаюсь использовать REST API из-за веб-прокси в моем приложении С#, для которого требуется базовая аутентификация.
Я проверил свои учетные данные, используя приложение Postman chrome, и проверил, что они работают. Однако, когда я запускаю свое приложение С#, я получаю неавторизованный ответ 401.
Посмотрев на некоторые следы запросов Postman и используя http://httpbin.org с моим приложением С#, я думаю, что происходит, что веб-прокси-сервер, за которым я работаю, не перенаправляет заголовок авторизации, потому что мой запрос отсутствует cookie, который (я думаю) настраивается более умными веб-клиентами (например, Postman, который построен поверх Chrome). Я вижу в трассе сети Postman, что он отправляет куки файл, который похож на его прокси-сервер.
Я не знаю, как это сделать в моем приложении С#, поскольку я использую довольно высокоуровневые API. Любая помощь будет оценена по достоинству:
Обновить:
Я смог заставить его работать, скопировав файл cookie, который я увидел в трассировке, и добавив его в свой запрос (вставив его в CookieStore
). Тем не менее, я не уверен, как я могу сделать это автоматически. Chrome должен каким-то образом получить это значение cookie и сохранить его. Есть ли способ заставить мое приложение сделать то же самое?
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
HttpClientHandler handler = new HttpClientHandler()
{
UseCookies = true,
CookieContainer = new System.Net.CookieContainer()
};
HttpClient client = new HttpClient(handler);
var byteArray = Encoding.UTF8.GetBytes(USER + ":" + PASS);
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Basic",
Convert.ToBase64String(byteArray));
var content = new FormUrlEncodedContent(new Dictionary<string, string> {
{ "field1", "value1" },
{ "field2", "value2" }
});
Console.WriteLine("Sending request");
var response = await client.PostAsync(HTTP_URL, content);
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine("Server response (" + response.StatusCode + "):\n" + responseString);
Похоже, что вы правильно "включили" куки файлы, поэтому любой ответ, который вы получите в ответ, должен быть отправлен автоматически с каждым последующим запросом при условии повторного использования одного и того же экземпляра HttpClient
для каждого из этих запросов.
В качестве побочного примечания, если вы не возражаете против небольшой зависимости от библиотеки, Flurl [отказ от ответственности: я автор] значительно упростит ваш код:
var client = new FlurlClient().EnableCookies();
var response = await HTTP_URL
.WithClient(client)
.WithBasicAuth(USER, PASS)
.PostUrlEncodedAsync(new {
field1 = "value1",
field2 = "value2",
});