试图找出一种在ASP.NET MVC请求管道中的对象之间保持数据的优雅方法

框架:ASP.Net MVC 3

当请求进入时,我通过全局filter拦截请求并基于子域执行数据库查找。 DB查找中的返回int需要持久保存到其他对象(即控制器),以便在需要该数据时不需要再次执行DB命中。

我希望避免使用cookie,因为这些信息是系统的一个相关部分,我不想依赖于启用cookie。

我已经阅读了这里和这里的相关问题,但没有提供任何好的答案。

我其实有两个问题:

  1. 到目前为止,我已经提出了一个子域管理器对象来完成繁重的工作,通过我的IoC,管理器对象是HTTP请求作用域,我可以在请求期间随时抓取该管理器作为可能的解决方案。

    在我查找之后,是否有更好的方法在MVC请求管道中的不同对象之间传递此信息? – 我已经检查了将信息以某种方式回到请求中的想法(这与问题#2有关)。

  2. 如果您要使用请求来存储数据(即拦截请求,执行查找,写入请求)哪里将是保存该信息的逻辑位置?

    我查看了会话,但这似乎与为会话配置Web服务器的方式密切相关,我已经提到过我不想使用cookie。 出于安全原因,其他区域(如发布数据和查询字符串集合)将被锁定。

有什么建议?

1非常接近。

你的SubDomain管理器可能是一个单例(也许使用你的IOC容器),一个简单的静态字典用于在数据初始加载后查找子域。 如果您担心发生此初始加载并在多个服务器之间同步而不多次执行数据加载,则可以查看分布式缓存(appfabric,ncache,memcache),具体取决于进行数据库调用的开销。

我不会使用HttpContext.Item来存储Id。 我会使用你的IOC容器将它注入你的控制器(可能是属性注入)。 使用大多数IOC容器,您应该能够在HttpRequest开始时触发此操作并持续“用户会话/事务”的生命周期。

NHibernate Burrows允许所有这些很容易实现它是可笑的http://nhforge.org/wikis/burrow/default.aspx

我认为你的第一个方法是使用IoC容器和http请求范围。

对于第二个问题:正确的位置是HttpContext.Items存储,它存储当前请求生命周期的键值对。