HttpClient 从 Kestrel + IIS 调用缓慢

HttpClient calls slow from Kestrel + IIS

我在 Kestrel 中有一个简单的 asp.net 核心 2.0 WebApi 应用程序 运行 在 IIS 反向代理后面。单路由很简单,就是一个http请求:

using (HttpClient client = new HttpClient())            
{
    client.BaseAddress = new Uri("http://www.google.ca");               
    HttpResponseMessage response = await client.GetAsync("/search?q=test&oq=test");

    return Ok();
}

但是,此请求始终需要 2-3 秒才能完成。然而,如果我 运行 Kestrel 直接在没有 IIS 的情况下,相同的代码需要大约 100 毫秒。

我按照所有 Microsoft docs 使用 IIS 配置 kestrel。

TL;DR 需要将 HttpClient 配置为不使用默认代理设置

HttpClientHandler clientHandler = new HttpClientHandler();
clientHandler.UseProxy = false;

using (HttpClient client = new HttpClient(clientHandler))           
{ ... }

详细的解释是 asp.net 尝试为每个请求使用机器的 default proxy configuration 设置。我的 IIS 在具有有限访问权限的网络服务帐户下配置为 运行,因此最终将无法(可能是因为它无法访问注册表)找到代理设置并直接连接。这个过程显然需要大约 2.5 秒。

对于我的 kestrel 测试,我是 运行ning dotnet .\api.dll 从命令行,它使用我的登录凭据,并且可以成功访问代理设置。但是,当使用 IIS 时,它会在 IIS 运行ning 作为的同一网络服务帐户下生成 dotnet 进程。