2012-06-27 3 views
1

Я пытаюсь переписать старую логику сетевой аутентификации в соответствии с новыми функциями 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 (один запуск за десяток запусков). Вопрос в том, что это ошибка или что? Пробовал отлаживать это с серверной стороны, никаких различий между запросами опроса не найдено. Заранее спасибо.

ответ

8

Это не ошибка. По умолчанию параметр IE - попытаться автоматически определить прокси-сервер, который может занять до 30 секунд. Чтобы отключить автоматическое обнаружение, вам необходимо установить UseProxy в False.

Фактически, настройки на самом деле не связаны с IE. Просто IE использует (и устанавливает) настройки системы по умолчанию. HttpClient и WebClient используют стандартные настройки системы, если вы не переопределите их.

Что касается скорости обнаружения, это зависит от настроек системы. Если вы отключите автоматическое обнаружение прокси-сервера в IE или Chrome, вы заметите, что ваш браузер открывается намного быстрее в первый раз после перезагрузки. Это происходит потому, что он не пытается обнаружить прокси. Процесс обнаружения прокси описан в Automatic Proxy Detection и включает в себя несколько этапов:

  1. Locate последний использовавшийся конфигурации прокси-скрипт
  2. Discover прокси от DHCP
  3. Уточняющий машина называется WAPD с использованием DNS

Шаги №2 и №3 могут занять много времени, в зависимости от вашей сетевой инфраструктуры, и могут даже включать таймауты.

+0

Почему же иногда обнаружение происходит на мгновение? И почему HttpClient даже связан с IE? Прочитайте MSDN и не найдете ссылок на это. – Jaded

Смежные вопросы