2012-06-27 31 views
1

我试图根据新的fw 4.5功能(如HttpClient和await/async)重写旧网络身份验证逻辑,并且遇到请求和响应之间的意外延迟(大约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; 
} 

认证发生在相应的视图模型的命令:

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 

当我在HttpClientHandler设置中取消注释UseProxy = false时,延迟消失且auth没有延迟。即使我没有取消注释UseProxy(每运行大约十次运行一次),问题也会发生。问题是 - 是一个错误还是什么?试图从服务器端进行调试,发现轮询请求之间没有差异。提前致谢。

回答

8

这不是一个错误。 IE的默认设置是尝试自动检测代理,这可能需要30秒。要禁用自动检测,您需要将UseProxy设置为False。

事实上,这些设置并不是真正与IE相关的。这只是IE使用(并设置)系统的默认设置。除非您覆盖它们,否则HttpClient和WebClient都使用系统的默认设置。

至于检测速度,它取决于系统设置。如果您在IE或Chrome中禁用自动代理检测功能,您将会注意到重新启动后第一次浏览器打开的速度要快得多。这是因为它不会尝试检测代理。代理检测处理中Automatic Proxy Detection描述并包括几个步骤:

  1. 找到最后使用的代理配置脚本
  2. 查询从DHCP
  3. 查找使用DNS

称为WAPD机器代理步骤#2和#3可能需要很长时间,具体取决于您的网络基础设施,甚至可能涉及超时。

+0

为什么有时候检测会立即发生?为什么HttpClient甚至与IE有关?阅读MSDN并没有找到任何的参考。 – Jaded