C# 在WebApi上下文中,为什么在using块中使用HttpClient是错误的?
所以,问题是为什么在使用block时使用HttpClient是错误的,而在WebApi上下文中使用HttpClient是错误的 我一直在读这篇文章。其中我们有以下示例:C# 在WebApi上下文中,为什么在using块中使用HttpClient是错误的?,c#,httpclient,using,webapi,C#,Httpclient,Using,Webapi,所以,问题是为什么在使用block时使用HttpClient是错误的,而在WebApi上下文中使用HttpClient是错误的 我一直在读这篇文章。其中我们有以下示例: public static async Task<JObject> GetJsonAsync(Uri uri) { // (real-world code shouldn't use HttpClient in a using block; this is just example code) using (
public static async Task<JObject> GetJsonAsync(Uri uri)
{
// (real-world code shouldn't use HttpClient in a using block; this is just example code)
using (var client = new HttpClient())
{
var jsonString = await client.GetStringAsync(uri);
return JObject.Parse(jsonString);
}
}
// My "top-level" method.
public class MyController : ApiController
{
public string Get()
{
var jsonTask = GetJsonAsync(...);
return jsonTask.Result.ToString();
}
}
那么,不是每个请求都调用构造函数,因此每次都会创建一个新的HttpClient吗
谢谢 实际上在写这个问题时,我注意到微软提供的代码示例中有一个静态构造函数。这一切现在都有意义了 用于初始化任何静态数据,或执行只需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,会自动调用它 在WebAPI的上下文中,静态构造函数只被调用一次,因此只创建一个HttpClient并将其用于所有其他请求 我再也不会在生产代码中使用(HttpClient…)
这是一篇关于HttpClient错误用法的好文章-在写这个问题时,我注意到Microsoft提供的代码示例中有一个静态构造函数。这一切现在都有意义了 用于初始化任何静态数据,或执行只需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,会自动调用它 在WebAPI的上下文中,静态构造函数只被调用一次,因此只创建一个HttpClient并将其用于所有其他请求 我再也不会在生产代码中使用(HttpClient…)
这是一篇关于HttpClient错误用法的优秀文章-对此有一个很长的答案 最初,官方建议在
using
块中使用HttpClient
。但这实际上会在TIME\u WAIT
状态下耗尽大量连接
因此,官方建议改为使用静态HttpClient
。但这在哪里造成了问题
因此,ASP.NET团队提出了这样的想法,代码(或至少是在现代平台上运行的代码)可以重用HttpClient
实例(或者更恰当地说,这些实例的消息处理程序),避免了TIME\u WAIT
问题,但也可以定期关闭这些连接以避免DNS问题
但是,与此同时,.NET团队提出了一种连接池,它也可以进行连接池
因此,在现代平台上,您可以使用
IHttpClientFactory
或静态/单例HttpClient
。在较旧的平台(包括.NET Framework)上,您可以使用静态/singletonHttpClient
,或者与DNS问题共存,或者。这个问题的答案有点长
最初,官方建议在using
块中使用HttpClient
。但这实际上会在TIME\u WAIT
状态下耗尽大量连接
因此,官方建议改为使用静态HttpClient
。但这在哪里造成了问题
因此,ASP.NET团队提出了这样的想法,代码(或至少是在现代平台上运行的代码)可以重用HttpClient
实例(或者更恰当地说,这些实例的消息处理程序),避免了TIME\u WAIT
问题,但也可以定期关闭这些连接以避免DNS问题
但是,与此同时,.NET团队提出了一种连接池,它也可以进行连接池
因此,在现代平台上,您可以使用
IHttpClientFactory
或静态/单例HttpClient
。在较旧的平台(包括.NET Framework)上,您可以使用静态/singletonHttpClient
,或者与DNS问题一起使用。也可以查看优秀文章:,,谢谢,刚刚想起另一篇与此主题相关的优秀文章。也可以查看优秀文章:,,谢谢,刚刚想起另一篇关于这个话题的好文章。谢谢你的精彩解释!真的比我想象的要多。谢谢你的解释!确实,这比我预想的要多。
public class GoodController : ApiController
{
private static readonly HttpClient HttpClient;
static GoodController()
{
HttpClient = new HttpClient();
}
}