RestClient应该是每个请求的单例还是新单元

Mic*_*Mao 11 c# asp.net restsharp

ASP.Net HttpClient可以部署和很多文章说,你应该使用Singleton模式来使用它,因为的性能,但是当我看到RestClient它不能处理,并在推荐,用法示例页面会newRestClient每次有什么我的问题我是应该使用单身模式RestClient还是应该new每次使用单一模式,如果我new每次都会出现任何性能问题?

RestSharp GitHub

一些参考:

必须处理HttpClient和HttpClientHandler

您正在使用HTTPCLIENT错误,并且正在使您的软件失效

Cod*_*ler 27

我应该为RestClient使用单例模式还是应该每次都使用它,如果我每次都新建它会对性能产生什么影响?

建议使用的方法RestSharp是为每个请求创建一个新实例.

它与推荐的Singleton方法不同HttpClient.其原因是,引擎盖下 RestSharp使用HttpWebRequest的HTTP交互,而不是HttpClient.这就是使用模式不同的原因.

如果我每次创建它都会像HttpClient一样出现性能问题吗?

您不应HttpClient为每个请求创建新实例的主要原因不是性能考虑因素.创建和初始化所花费的时间将花费很少的时间来跟踪网络呼叫.使用单例实例的主要原因HttpClient 如下:

HttpClient旨在实例化一次,并在应用程序的整个生命周期中重复使用.为每个请求实例化一个HttpClient类将耗尽重负载下可用的套接字数量.这将导致SocketException错误.

RestSharp不使用连接池,HttpClient并且在使用后不会留下打开的套接字.这就是为RestClient每个请求创建一个新实例是安全的(并推荐)的原因.

如果使用重用实例,您会获得任何性能提升RestClient吗?那么,您将节省创建对象及其初始化的时间.然而,这个时间非常接近0,而且这只是花在跟踪网络呼叫上的一小部分时间.您不会List<T>因为性能考虑而重用其他.NET对象,不是吗?你也应该这样做RestClient.它只是以一种暗示这种使用场景的方式开发的.

  • v107 版本中的模式发生了变化 https://restsharp.dev/v107/#restsharp-v107 不要为单个调用实例化客户端,否则您会遇到挂起连接的问题,并且连接池将无法实现。 (6认同)
  • 不确定这是否准确,我本来打算在一个项目中实现 RestSharp,但因为它似乎在每个请求上使用新的套接字而踩了刹车,这可能会导致任何规模的套接字耗尽。github.com/restsharp/RestSharp/issues/1322 (3认同)
  • 读完这个答案后,我想知道将 `IRestClient` 作为瞬态注入到 WebApi 服务是否有意义? (2认同)
  • 只是为了给您提供更多信息,HttpWebRequest 在每次实例化时都会实例化 HttpClient,从而导致 Microsoft 文档详细说明的套接字耗尽。由于 RestSharp 的 RestClient 使用 HttpWebRequest,因此在应用程序的不同部分多次实例化 RestClient 会导致相同的套接字耗尽。代码可以在这里看到:https://github.com/dotnet/corefx/blob/07080ceab1e5b305d8a5fecd9d5b793fb502d57a/src/System.Net.Requests/src/System/Net/HttpWebRequest.cs#L1101 (2认同)

tit*_*tol 21

对于 Restclient 版本 >= 107:

从版本开始,v107您应该只创建一个实例。该版本在内部使用HttpClient

不要为每个 HTTP 调用实例化 RestClient。RestSharp 在内部创建 HttpClient 的新实例,您将获得大量挂起的连接,并最终耗尽连接池。

如果您使用依赖项注入容器,请将您的 API 客户端注册为单例。

RestClient生命周期

如果您想知道为什么会出现这种情况,可以在此处查看解释