0

我正在使用System.Net.Http.HttpClient与后端MVC4应用程序中的RESTful服务交谈。根据提出请求的用户,身份验证标头与RESTful服务的通信会有所不同,因此应该为每个用户缓存标头中设置的值。这些值在会话的整个生命周期中可能会更改。.NET MVC HttpClient生命周期

我正在使用StructureMap for DI。有些问题:

  1. 根据this听起来应该有HttpClient的的所有请求的单个实例。虽然some say直接注入HttpClient可能是一个坏主意,因为它是IDisposabe,others say它没有必要处置它。那么,注入HttpClient的最佳方法是什么?
  2. HttpClient的单个实例可能会在运行期间被丢弃或失效(可能是REST服务器重新启动)?如果是这样,那么我认为没有选择直接注入HttpClient,它必须包装在一个管理器类中,该类将检查HttClient实例是否有效,并在出现问题时实例化新客户端。问题是我没有看到一种方式进行测试。
  3. 哪里是缓存用户特定认证头信息的最佳位置?我不认为从控制器传递信息到服务层是干净的,因为它似乎是suggested here,所以我认为HttpSession在数据层中的注入对象范围是这里的方式,但是会爱上听取其他想法。

回答

0

当您的MVC4应用程序启动时创建HttpClient,并在关闭时处理它。如果使用HttpClient调用的服务器重新启动,则不需要您创建HttpClient的新实例。 TCP连接在ServicePointManager的封面下独立管理。

我不明白你关于用户特定认证信息的问题。您是否试图让您的MVC网站在您致电RESTful服务时冒充用户?如果是这样,那么只需在每个请求上设置Auth头。

+0

你究竟如何创建/注入单身HttpClient - 裸体或与一些经理/包装?关于设置auth头文件,我正在询问在构建头文件值时将用于存储/缓存用户信息的位置。在我的情况下,它是授权标题,但可以应用于每个用户在每个请求上需要提交的任何内容。 – Alex

+0

我想我需要澄清的是,传递给标题的用户信息将在每个新会话开始时确定。我会更新我原来的问题。 – Alex

+0

@Alex我会尝试使用HttpClient裸体。包装HttpClient可能会很痛苦。 –