HttpClient从Kestrel + IIS调用缓慢

use*_*318 5 iis reverse-proxy dotnet-httpclient kestrel-http-server asp.net-core-2.0

我在一个IIS反向代理后面的Kestrel中运行了一个简单的asp.net core 2.0 WebApi应用程序.单个路由非常简单,它只是发出一个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();
}
Run Code Online (Sandbox Code Playgroud)

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

我按照所有Microsoft 文档来配置使用IIS的kestrel.

use*_*318 5

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

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

using (HttpClient client = new HttpClient(clientHandler))           
{ ... }
Run Code Online (Sandbox Code Playgroud)

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

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