Я пытаюсь переписать старую логику сетевой аутентификации в соответствии с новыми функциями fw 4.5, такими как HttpClient и ждать/асинхронно, и я испытываю непредвиденную задержку (около 15 секунд) между запросом и ответом. Я предполагаю, что это происходит, потому что клиент пытается найти/использовать прокси-сервер из IE, как это было со старым HttpRequest/WebClient. Вот код:Проблемы с настройками прокси-сервера HttpClient
public static async Task<AuthResult> GetDataFromServiceAsync(string url, string login, string password)
{
Debug.WriteLine("[" + DateTime.Now + "] GetDataFromServiceAsync");
var handler = new HttpClientHandler { Credentials = new NetworkCredential(login, password)/*, UseProxy = false*/ };
var client = new HttpClient(handler) { MaxResponseContentBufferSize = Int32.MaxValue };
try
{
var resp = await client.GetAsync(new Uri(url));
var content = resp.Content.ReadAsStringAsync().Result;
var auth = ParseContent(content);
Debug.WriteLine("[" + DateTime.Now + "] Returning AuthResult : " + auth);
return new AuthResult { Success = auth, Exception = null};
}
catch (Exception exception)
{
//
Debug.WriteLine("[" + DateTime.Now + "] Returning error AuthResult : " + exception.Message);
return new AuthResult { Success = false, Exception = exception }; ;
}
}
}
Этот метод обернут другим методом из API, что на самом деле ничего не делает, имеющие отношение к данному делу:
public async Task<AuthResult> IsAuthenticated(string login, string password)
{
Debug.WriteLine("[" + DateTime.Now + "] Starting ISAuthenticationService.IsAuthenticated");
// ... (cut) ...
// async
var authResult = await ISHelpers.GetDataFromServiceAsync(url, login, password);
Debug.WriteLine("[" + DateTime.Now + "] Ending ISAuthenticationService.IsAuthenticated");
return authResult;
}
Аутентификация происходит в соответствующей команде ViewModel:
private async void ExecuteAuthenticationCommand()
{
// Test stub
//var authService = new Helpers.MockupAuthenticationService();
var authService = new Helpers.ISAuthenticationService();
var auth = await authService.IsAuthenticated(Login, Password);
if (auth.Success)
{
MessageBox.Show("Authentication success");
Messenger.Default.Send<LoginDataItem>(_dataItem);
}
else
{
MessageBox.Show(auth.Exception.Message, "Incorrect login data");
}
}
Отладочный выход:
[27.06.2012 16:54:10] Starting ISAuthenticationService.IsAuthenticated
[27.06.2012 16:54:10] GetDataFromServiceAsync
[27.06.2012 16:54:25] ParseContent in GetDataFromServiceAsync
[27.06.2012 16:54:25] Returning AuthResult : True
[27.06.2012 16:54:25] Ending ISAuthenticationService.IsAuthenticated
Когда я раскомментирую UseProxy = false в настройках HttpClientHandler, время ожидания исчезает, а auth не имеет задержки. Проблема такая же случается иногда даже тогда, когда я не раскомментирую UseProxy (один запуск за десяток запусков). Вопрос в том, что это ошибка или что? Пробовал отлаживать это с серверной стороны, никаких различий между запросами опроса не найдено. Заранее спасибо.
Почему же иногда обнаружение происходит на мгновение? И почему HttpClient даже связан с IE? Прочитайте MSDN и не найдете ссылок на это. – Jaded