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

本文关键字:管道 请求 MVC 对象 保存 数据 之间 NET 方法 一种 ASP | 更新日期: 2023-09-27 18:36:04

Framework: ASP.Net MVC 3

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

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

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

我实际上有两个问题:

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

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

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

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

有什么建议吗?

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

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

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

1 非常接近。

您的子域

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

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

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