Я пытаюсь использовать учетные данные для аутентификации на прокси-сервере из службы Windows на клиентском сайте, но продолжаю получать следующий ответ:
StatusCode: 407, ReasonPhrase: «Требуется проверка подлинности прокси», Версия: 1.1, Содержимое: System.Net.Http.StreamContent, Заголовки: {
Прагма: без кеша
Прокси-соединение: закрыть
Соединение: закрыть
Контроль кэша: без кэширования
Proxy-Authenticate: NTLM
Set-Cookie: BCSI-CS-2737f33ff5b5f739 = 2;Путь = /
Длина содержимого: 1351
Тип содержимого: text / html;charset = utf-8
}
Мой локальный прокси настроен совершенно по-другому, и я не могу воссоздать проблему.Вот код, который я использую для аутентификации на сервере.(Как уже упоминалось в коде, он основан на: HttpClient и использовании прокси-сервера - постоянно получает 407
private HttpClient GenerateHttpClientWithProxySettings()
{
//Code based on https://stackoverflow.com/questions/29856543/httpclient-and-using-proxy-constantly-getting-407
// First create a proxy object
var proxy = new WebProxy()
{
Address = new Uri($"{Settings.ProxyAddress}:{Settings.PortNumber}"),
BypassProxyOnLocal = false,
UseDefaultCredentials = false,
// *** These creds are given to the proxy server, not the web server ***
Credentials = new NetworkCredential(
userName: Settings.ProxyUserName,
password: Settings.ProxyPassword)
};
//Debug:
Settings.log.Debug($"{Settings.ProxyAddress}:{Settings.PortNumber}");
Settings.log.Debug(Settings.ProxyUserName);
Settings.log.Debug(Settings.ProxyPassword);
// Now create a client handler which uses that proxy
var httpClientHandler = new HttpClientHandler()
{
Proxy = proxy,
UseProxy = true,
AllowAutoRedirect = true,
};
//// Omit this part if you don't need to authenticate with the web server:
//if (needServerAuthentication)
//{
// httpClientHandler.PreAuthenticate = true;
// httpClientHandler.UseDefaultCredentials = false;
// // *** These creds are given to the web server, not the proxy server ***
// httpClientHandler.Credentials = new NetworkCredential(
// userName: serverUserName,
// password: serverPassword);
//}
// Finally, create the HTTP client object
HttpClient client = new HttpClient(handler: httpClientHandler, disposeHandler: true);
return client;
}
//Get
private async Task<ReturnedData> GetRequestWithProxy(string url)
{
ReturnedData result = new ReturnedData();
using (HttpClient client = GenerateHttpClientWithProxySettings())
{
using (HttpResponseMessage message = await client.GetAsync(url))
{
Settings.log.Debug("[[message:]]");
Settings.log.Debug(message.ToString());
result.StatusCode = message.StatusCode.ToString();
result.Succceded = message.IsSuccessStatusCode;
using (HttpContent content = message.Content)
{
Settings.log.Debug("[[content:]]");
Settings.log.Debug(content.ToString());
result.Content = await message.Content.ReadAsStringAsync();
return result;
}
}
}
}
// Post
private async Task<ReturnedData> PostRequestWithProxy(string url, dynamic payload)
{
ReturnedData result = new ReturnedData();
string stringPayload = await Task.Run(() => JsonConvert.SerializeObject(payload));
// Wrap our JSON inside a StringContent which then can be used by the HttpClient class
using (var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/json"))
{
using (HttpClient client = GenerateHttpClientWithProxySettings())
{
using (HttpResponseMessage message = await client.PostAsync(url, httpContent))
{
Settings.log.Debug(message.ToString());
result.StatusCode = message.StatusCode.ToString();
result.Succceded = message.IsSuccessStatusCode;
using (HttpContent content = message.Content)
{
Settings.log.Debug(content.ToString());
result.Content = await message.Content.ReadAsStringAsync();
return result;
}
}
}
}
}
Любая помощь в том, что я делаю здесь неправильно, будет принята с благодарностью.
Спасибо!