C# 在aspnetcore mvc控制器中处理httpClient

C# 在aspnetcore mvc控制器中处理httpClient,c#,rest,asp.net-core-mvc,asp.net-core-webapi,C#,Rest,Asp.net Core Mvc,Asp.net Core Webapi,我正在创建一个新的Asp.NETCore(NETStandard2)Mvc控制器,它使用WebAPI(REST)调用来获取数据。我一直在关注互联网上来自微软和非微软的许多例子。这些都使用“标准”using(var client=new HttpClient())构造。 但是,请阅读文档以了解更多信息 HttpClient打算实例化一次并在整个过程中重复使用 应用程序的生命周期。实例化的HttpClient类 每一个请求都会耗尽重型设备下可用的插座数量 荷载。这将导致SocketException

我正在创建一个新的Asp.NETCore(NETStandard2)Mvc控制器,它使用WebAPI(REST)调用来获取数据。我一直在关注互联网上来自微软和非微软的许多例子。这些都使用“标准”using(var client=new HttpClient())构造。
但是,请阅读文档以了解更多信息

HttpClient打算实例化一次并在整个过程中重复使用 应用程序的生命周期。实例化的HttpClient类 每一个请求都会耗尽重型设备下可用的插座数量 荷载。这将导致SocketException错误。下面是一个例子 正确使用HttpClient

这让我思考,我是创建一个作用域实例并将其添加到DI中,还是在同一页面上按照他们的示例在控制器上创建一个静态实例?如果是静态实例,如何处理它

或者,有人能给我指一个标准CRUD视图实现的生产就绪MVC包装器吗?

如果您还没有阅读

如果你有什么负担,你需要记住这两个 事情:

  • 使您的HttpClient保持静态
  • 除非您明确寻找特定行为(例如导致服务失败),否则不要在using中处置或包装您的HttpClient
  • 我同意mike z在这种情况下可以使用DI

    e、 g.SimpleInjector's负责处理

    Simple Injector保证以相反的方式处理实例 创造的顺序


    如果你还想把它包起来,看看

    Upd: 确保您处理了
    HttpRequestMessage
    HttpResponseMessage
    的实例

    来源:

    如果您没有阅读

    如果你有什么负担,你需要记住这两个 事情:

  • 使您的HttpClient保持静态
  • 除非您明确寻找特定行为(例如导致服务失败),否则不要在using中处置或包装您的HttpClient
  • 我同意mike z在这种情况下可以使用DI

    e、 g.SimpleInjector's负责处理

    Simple Injector保证以相反的方式处理实例 创造的顺序


    如果你还想把它包起来,看看

    Upd: 确保您处理了
    HttpRequestMessage
    HttpResponseMessage
    的实例


    来源:

    对于任何使用.net core 2.1或更高版本的用户,建议使用
    HttpClientFactory

    为了解决上述问题并简化HttpClient实例的管理,.NET Core 2.1引入了一个新的HttpClientFactory,它也可用于实现弹性HTTP调用


    了解如何利用它

    对于使用.net core 2.1或更高版本的用户,建议使用
    HttpClientFactory

    为了解决上述问题并简化HttpClient实例的管理,.NET Core 2.1引入了一个新的HttpClientFactory,它也可用于实现弹性HTTP调用


    了解如何利用它

    您仍然可以使用DI。只需将其生命周期声明为singleton(或者DI对单个实例而不是作用域使用的任何术语)要使所有作用域共享同一实例,请注意,如果您的
    httpclient
    位于具有
    singletone
    生存期的服务中,并且如果该服务依赖于其他服务,则这些其他服务不应
    作用域
    。您仍然可以使用DI。只需将其生命周期声明为singleton(或者DI对单个实例而不是作用域使用的任何术语)要让所有作用域共享同一实例,请注意,如果您的
    httpclient
    位于具有
    singletone
    生存期的服务中,并且如果该服务依赖于其他服务,则这些其他服务的作用域不应为
    ?我们应该
    Dispose()
    还是不应该?@SkorunkaFrantišek,您应该处理两个类的实例
    httprequestmeessage
    HttpResponseMessage
    示例:Src:有意义。如果因为使用了
    GetAsync(stringrequesturi)
    override而没有
    HttpRequestMessage
    ,该怎么办?是否以某种方式处理了它?如果您想要一个完整的控件,请使用
    sendaync()
    而不是像
    GetAsync()
    postasync()
    等包装器。在
    GetAsync()
    的情况下,这不应该是一个问题,因为HTTP GET受到2k的限制。所以GC会处理好的。这是有道理的。无论如何,如何将最大请求长度连接到Dispose?谢谢。关于
    HttpResponseMessage
    如何?我们应该
    Dispose()
    还是不应该?@SkorunkaFrantišek,您应该处理两个类的实例
    httprequestmeessage
    HttpResponseMessage
    示例:Src:有意义。如果因为使用了
    GetAsync(stringrequesturi)
    override而没有
    HttpRequestMessage
    ,该怎么办?是否以某种方式处理了它?如果您想要一个完整的控件,请使用
    sendaync()
    而不是像
    GetAsync()
    postasync()
    等包装器。在
    GetAsync()
    的情况下,这不应该是一个问题,因为HTTP GET受到2k的限制。所以GC会处理好的。这是有道理的。无论如何,如何将最大请求长度连接到Dispose?非常感谢。