新HttpClient的代理设置问题(New HttpClient proxy settings i

2019-07-30 03:52发布

我试图根据新FW 4.5功能,如HttpClient的重写旧网络认证逻辑和等待/异步和我体验请求和响应之间的意外延迟(约15秒)。 我的猜测是,是因为客户端试图找到IE /使用代理就像是旧的HttpRequest / Web客户端。 下面的代码:

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

当我去掉UseProxy =在HttpClientHandler假设置,延迟去世和AUTH没有延迟。 问题是,当我不取消注释UseProxy(约每打一个运行运行)相同,有时甚至发生。 现在的问题是 - 这是一个bug还是什么? 试图调试,从服务器端,发现​​轮询请求之间没有差异。 提前致谢。

Answer 1:

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

实际上,设置并没有真正涉及到IE浏览器。 这只是IE浏览器使用(并集)系统的默认设置。 HttpClient的和WebClient的,除非你覆盖它们都使用系统的默认设置。

至于检测速度,这取决于系统设置。 如果禁用IE中或Chrome自动代理检测,你会发现,你的浏览器重新启动后打开快得多的第一次。 这是因为它不尝试检测代理。 代理检测方法描述自动代理检测 ,并涉及几个步骤:

  1. 找到最后使用代理配置脚本
  2. 发现从DHCP代理
  3. 查找一个名为WAPD使用DNS机

步骤#2和#3可能需要很长的时间,这取决于你的网络基础设施,甚至可能涉及超时。



文章来源: New HttpClient proxy settings issues