0

框架:ASP.Net MVC 3

当一个请求进来时,我通过一个全局过滤器拦截请求并基于子域执行数据库查找。从 DB 查找返回的 int 需要持久化到其他对象(即控制器),以便在可能需要该数据时无需再次执行 DB 命中。

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

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

我其实有两个问题:

  1. 到目前为止,我已经提出了一个子域管理器对象,它可以完成繁重的工作,并通过我的 IoC 将管理器对象设置为 HTTP 请求范围,并且我可以在请求期间随时获取该管理器作为可能的解决方案。

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

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

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

有什么建议么?

4

2 回答 2

2

我认为您使用 IoC 容器和 http 请求范围的第一种方法很好。

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

于 2012-06-01T12:01:01.873 回答
1

1 非常接近。

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

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

NHibernate Burrows 让所有这些都可以轻松实现,这很可笑http://nhforge.org/wikis/burrow/default.aspx

于 2012-06-01T12:07:30.257 回答