gpt4 book ai didi

.net - HttpClient 在服务器上启用缓存

转载 作者:行者123 更新时间:2023-12-02 17:13:37 24 4
gpt4 key购买 nike

我正在尝试启用 System.Net.HttpClient 的客户端缓存。我在 http://localhost:83/api/test 有一个端点这需要 1 秒的时间来响应,并且它会发回缓存 header 。

如果我有这段代码

static async Task MainAsync()
{
var client = new HttpClient(new WebRequestHandler { CachePolicy = new HttpRequestCachePolicy() }) { BaseAddress = new Uri("http://localhost:83/api/") };
for (int i = 0; i < 20; i++)
{
var response = await client.GetAsync("test");
var res = await response.Content.ReadAsStringAsync();
Console.WriteLine(res);
}
}

执行需要一秒。

如果我将相同的代码放入 api Controller

    static HttpClient client = new HttpClient(new WebRequestHandler {CachePolicy = new HttpRequestCachePolicy() }) { BaseAddress = new Uri("http://localhost:83/api/") };
public async Task<string> Get()
{
for (int i = 0; i < 20; i++)
{
var response = await client.GetAsync("test");
var res = await response.Content.ReadAsStringAsync();
}
return "ok";
}

在 IIS 中托管它需要 20 秒来响应。

我需要做什么才能从服务器应用程序启用客户端缓存?

最佳答案

也许您应该切换到 WinHTTP 并使用另一个 HTTP 缓存实现。

.NET Framework 使用两个 HTTP 客户端 API。一个由 WinINet 提供,另一个由 WinHTTP 提供。 .NET Framework 默认使用 WinINet。但是 WinINet 是为在客户端应用程序中工作而开发的,它不应该在服务器环境中工作。相关引自Windows Internet MSDN 上的页面:

Where applicable

WinINet does not support server implementations. In addition, it should not be used from a service. For server implementations or services use Microsoft Windows HTTP Services (WinHTTP).

因此在您的 Web API 中您需要使用 WinHTTP。我知道的唯一切换方法是使用 System.Net.Http.WinHttpHandler 中的 WinHttpHandler NuGet 包。但目前此处理程序不使用 HTTP 缓存。它无法设置缓存策略,并且会忽略 HttpClientHandler 遵守的所有设置。参见 How do I utilize HTTP caching with WinHttpHandler and HttpClient? GitHub 上的问题。

要解决此问题,您可以实现自己的缓存机制或使用现有的缓存机制,例如 CacheCow项目。它有内置的内存存储和它自己的 DelagatingHandler 实现,用于 HttpClient。 请注意,目前存在一些兼容性问题,在安装 System.Net.Http.WinHttpHandler 和 CacheCow.Clien NuGet 包之前,您需要从 Web API 项目中手动删除对 .NET Framework System.Net.Http 的引用。以下代码片段演示了 CacheCow.Clien NuGet 包中 WinHttpHandlerCachingHandler 的用法:

static HttpClient client = new HttpClient(new CachingHandler { InnerHandler = new WinHttpHandler() })
{
BaseAddress = new Uri("http://localhost:83/api/")
};

更多信息请查看:

关于.net - HttpClient 在服务器上启用缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47715084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com