RestSharp 客户端包装器的生命周期应该是多长?
What should the lifetime of RestSharp client wrapper be?
在将我们的应用程序迁移到新的 RestSharp version 的过程中,我们注意到文档推荐了以下用法:
public class GitHubClient {
readonly RestClient _client;
public GitHubClient() {
_client = new RestClient("https://api.github.com/")
.AddDefaultHeader(KnownHeaders.Accept, "application/vnd.github.v3+json");
}
public Task<GitHubRepo[]> GetRepos()
=> _client.GetAsync<GitHubRepo[]>("users/aspnet/repos");
}
考虑到 new RestClient()
在幕后确实 new HttpClient(handler)
,GitHubClient
应该是 Singleton 吗?或者它的生命周期根本不应该有任何影响?
通常,API 客户端将被注册为单例,因为它必须是线程安全的。在这种情况下,RestClient
的包装实例及其内部 HttpMessageHandler
(HttpClient
在这里并不重要)将是一个单例。
基本上,RestSharp 的大量问题与其使用旧版 HttpWebRequest
有关,后者内部有一个原始的 HttpClient
缓存。 RestRequest
,因此,HttpWebRequest
曾经有许多属性,当这些属性发生变化时会触发新 HttpMessageHandler
的实例化。这导致了您可能想象到的所有问题,这些问题在 Microsoft docs.
中零售
你的问题提醒我 HttpClient
是一次性的,但当前的 RestClient
不是(根据 v107.0.4),所以我会在下一个补丁中添加它。
在将我们的应用程序迁移到新的 RestSharp version 的过程中,我们注意到文档推荐了以下用法:
public class GitHubClient {
readonly RestClient _client;
public GitHubClient() {
_client = new RestClient("https://api.github.com/")
.AddDefaultHeader(KnownHeaders.Accept, "application/vnd.github.v3+json");
}
public Task<GitHubRepo[]> GetRepos()
=> _client.GetAsync<GitHubRepo[]>("users/aspnet/repos");
}
考虑到 new RestClient()
在幕后确实 new HttpClient(handler)
,GitHubClient
应该是 Singleton 吗?或者它的生命周期根本不应该有任何影响?
通常,API 客户端将被注册为单例,因为它必须是线程安全的。在这种情况下,RestClient
的包装实例及其内部 HttpMessageHandler
(HttpClient
在这里并不重要)将是一个单例。
基本上,RestSharp 的大量问题与其使用旧版 HttpWebRequest
有关,后者内部有一个原始的 HttpClient
缓存。 RestRequest
,因此,HttpWebRequest
曾经有许多属性,当这些属性发生变化时会触发新 HttpMessageHandler
的实例化。这导致了您可能想象到的所有问题,这些问题在 Microsoft docs.
你的问题提醒我 HttpClient
是一次性的,但当前的 RestClient
不是(根据 v107.0.4),所以我会在下一个补丁中添加它。