Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WebApi上下文中,为什么在using块中使用HttpClient是错误的?_C#_Httpclient_Using_Webapi - Fatal编程技术网

C# 在WebApi上下文中,为什么在using块中使用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 (

所以,问题是为什么在使用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 (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)上,您可以使用静态/singleton
HttpClient
,或者与DNS问题共存,或者。

这个问题的答案有点长

最初,官方建议在
using
块中使用
HttpClient
。但这实际上会在
TIME\u WAIT
状态下耗尽大量连接

因此,官方建议改为使用静态
HttpClient
。但这在哪里造成了问题

因此,ASP.NET团队提出了这样的想法,代码(或至少是在现代平台上运行的代码)可以重用
HttpClient
实例(或者更恰当地说,这些实例的消息处理程序),避免了
TIME\u WAIT
问题,但也可以定期关闭这些连接以避免DNS问题

但是,与此同时,.NET团队提出了一种连接池,它也可以进行连接池


因此,在现代平台上,您可以使用
IHttpClientFactory
或静态/单例
HttpClient
。在较旧的平台(包括.NET Framework)上,您可以使用静态/singleton
HttpClient
,或者与DNS问题一起使用。

也可以查看优秀文章:,,谢谢,刚刚想起另一篇与此主题相关的优秀文章。也可以查看优秀文章:,,谢谢,刚刚想起另一篇关于这个话题的好文章。谢谢你的精彩解释!真的比我想象的要多。谢谢你的解释!确实,这比我预想的要多。
public class GoodController : ApiController
{
    private static readonly HttpClient HttpClient;

    static GoodController()
    {
        HttpClient = new HttpClient();
    }
}