ASP.NetHttpClient
是一次性的,很多文章都说,由于性能的原因,应该使用单例模式来使用它。但是当我看到RestClient
时,它不能被处理,并且在Recommended-Usage页面中,示例每次都将new
RestClient
。我应该对RestClient
使用单例模式还是每次都使用new
?如果我每次都new
它会有任何性能问题吗?
RestSharp GitHub
一些参考文献:
Do HttpClient and HttpClientHandler have to be disposed
YOU'RE USING HTTPCLIENT WRONG AND IT IS DESTABILIZING YOUR SOFTWARE
2条答案
按热度按时间monwx1rj1#
Restclient版本〈107:
我应该为RestClient使用单例模式,还是每次都更新它,如果每次都更新它,会有性能问题吗?
使用
RestSharp
的推荐方法是为每个请求创建一个新示例。它不同于
HttpClient
推荐的Singleton方法。原因是under the hoodRestSharp
使用HttpWebRequest
进行HTTP交互,而不是HttpClient
。这就是使用模式不同的原因。如果我每次都创建它,我会像HttpClient一样遇到性能问题吗?
不应该为每个请求创建一个新的
HttpClient
示例的主要原因不是性能方面的考虑。创建和初始化所花费的时间将占用后续网络调用所花费的时间的一小部分。使用HttpClient
is the following的单例示例的主要原因:HttpClient的目的是示例化一次,并在应用程序的整个生命周期中重用。为每个请求示例化一个HttpClient类将耗尽重负载下可用的套接字数量。这将导致SocketException错误。
RestSharp
不像HttpClient
那样使用连接池,并且在使用后不会留下打开的套接字。这就是为什么在每个请求中创建一个新的RestClient
示例是安全的(并且是推荐的)。如果你使用
RestClient
的重用示例,你会获得任何性能提升吗?好吧,你将保存创建对象和初始化的时间。然而,这一时间非常接近0
,而且它只是后续网络呼叫所花费的时间的一小部分。你不能重复使用其他的。NET对象,如List<T>
,因为性能的考虑,是吗?您应该对RestClient
执行相同的操作。它只是以一种暗示这种使用场景的方式开发的。fnvucqvd2#
对于Restclient版本〉= 107:
从
v107
版本开始,您应该只创建一个示例。此版本在内部使用HttpClient
。不要为每个HTTP调用示例化RestClient。RestSharp在内部创建了一个新的HttpClient示例,你会得到大量挂起的连接,最终耗尽连接池。
如果使用依赖注入容器,请将API客户端注册为单例。
RestClient生命周期
如果您想知道为什么会出现这种情况,可以查看解释here