c# - 使用 caSTLe-windsor 的 MVC4 中 HttpClient 的生活方式

标签 c# asp.net asp.net-mvc-4 castle-windsor dotnet-httpclient

在 Web 请求中,我想使用 Microsoft HttpClient 调用另一台服务器。我使用 MVC4(托管在 IIS 中)和 caSTLe-windsor 作为 IOC 容器。我读到 HttpClient 被设计为在多次调用期间存在,我的问题是我应该如何实现它。

我提出了一些选择:

  1. 忽略 HttpClient 是为多次调用而设计的这一事实,并在每次需要时创建一个新的调用。
  2. 创建一个 Singleton(城堡中的生活方式)对象,用于在调用之间存储 HttpClient。这有什么风险吗?如果多个 Web 请求使用同一个 HTTP 客户端,性能会很差吗?

有没有更好的模式来做到这一点?

最佳答案

我会使用 LifestyleTransient 为每个请求创建一个新的。当您不确定该类是否可以作为单例运行时,这是最安全的。

依赖抽象(接口(interface))而不是直接依赖 HttpClient 也不是一个坏主意,除非您确定除了发出 HTTP 请求之外永远不会使用该类。即使如此,它也可能使单元测试变得更容易。这是使用 Windsor 或其他 DI 容器的一大好处。否则,与直接在类中实例化 HttpClient 相比并没有多大好处。


更新。我做了一些查找,发现this answer指示 HttpClient 应该为给定的 API 重用。它得到了高度的支持,我没有看到任何与经验(或其他)不同的意见,所以我将在进行一些近期开发时引用它。

我将通过定义一个实现接口(interface)的强类型客户端类来实现这一点,然后依赖于我的类中的接口(interface)(不是直接在客户端上)。然后 Windsor 可以为接口(interface)创建类并将其维护为一个单例。

关于c# - 使用 caSTLe-windsor 的 MVC4 中 HttpClient 的生活方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36828560/

相关文章:

asp.net-mvc-4 - HTTP 错误 404.3 未找到

C#:实现 NetworkStream.Peek?

asp.net - IIS 如何知道它是为网站还是 Web 应用程序项目提供服务?

c# - 使用配置文件指定连接字符串来定义单元测试中的数据源

asp.net - Ajax ModalPopup在IE8中显示错误

c# - 在 asp.net 中从 javascript 调用服务器代码时未定义值

c# - MVC4 : Compilation Error The type 'System.Data.Objects.DataClasses.EntityObject' is defined in an assembly that is not referenced

c# - 使用 Entity Framework 将 SQL Server 数据库中的表拉入 C# 中的 List<>

c# - 选择带有 "Html Agility pack"的特定 html

c# - MySQL 连接问题