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 进程。
我在 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 进程。