在asp.net MVC2中的每个Web请求上创建的nhibernate会话

时间:2010-11-10 20:28:01

标签: asp.net nhibernate asp.net-mvc-2

我有一个使用NHibernate进行数据访问的ASP.net MVC2应用程序。在每个请求上,即使是静态文件请求(图像,javascript),也会创建一个新会话。因此,对于我正在返回列表的单个视图,我创建了大约15个不加载任何内容的会话。

是否只能在需要时创建会话?

我目前正在使用Castle.Windsor将会话注入我的控制器。

有没有办法过滤掉静态文件请求?

4 个答案:

答案 0 :(得分:3)

听起来您需要在路由中排除这些路径:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    // add these lines
    routes.IgnoreRoute("{resource}.jpg");
    routes.IgnoreRoute("{resource}.js");
}

虽然如果你问我,对静态文件的请求不应该是实例化控制器。你可能想看看你的代码并找出它为什么这样做。

答案 1 :(得分:3)

我还想到这不是NHibernate或MVC的配置。 ASP.net开发服务器通过ASP.net为每个请求提供服务。除非已配置,否则IIS不会通过ASP.net发送静态文件请求。

从这里(http://www.asp.net/hosting/tutorials/core-differences-between-iis-and-the-asp-net-development-server-cs)

  

IIS之间的另一个核心区别   和ASP.NET开发服务器是   他们如何处理静态请求   内容。每一个请求   ASP.NET开发服务器,   无论是ASP.NET页面,图像,   或者由JavaScript文件处理   ASP.NET运行时。默认情况下,IIS   仅在调用ASP.NET运行时   一个ASP.NET的请求   资源,例如ASP.NET网页,   Web服务,等等。要求   对于静态内容 - 图像,CSS   文件,JavaScript文件,PDF文件,   ZIP文件等等   由IIS检索而没有   参与ASP.NET运行时。

答案 2 :(得分:1)

你是如何创建会话的,因为.jpg不应该要求ISession的实例,因此城堡不会创建一个(根据我的理解),你可以发布城堡设置,你是如何实现它的工厂?

要注意的事项

  1. 确保您的会话工厂是单身人士
  2. 使用SessionFactory中的OpenSession

    以PerWebRequest创建会话
    //Setup the Hibernate dependencies
        container.AddFacility<FactorySupportFacility>().Register(
            Component.For<ISessionFactory>().LifeStyle.Singleton
                .Instance(NHibernateHelper.GetSessionFactory()),
            Component.For<ISession>().LifeStyle.PerWebRequest
                .UsingFactoryMethod(kernel => kernel.Resolve<ISessionFactory>().OpenSession())
            );
    

    一旦你将MVC注册为控制器工厂,它应该只创建一个会话PerWebRequest,并且只有当控制器或其依赖者依赖它时

  3. 我有一个示例app,如果它有帮助

答案 3 :(得分:0)

我使用Spring.NET,而不是Castle Windsor,但我认为概念是相同的。 ISession的范围应该根据请求定义,并且在被要求之前不应该实际创建,正如dbones所说的那样。当MVC处理每个请求时,要求.jpg不应该击中依赖于ISession的控制器。

Castle Windsor是否热切地根据请求对象而不是按需创建?这可能是配置问题。或者您是否有自定义模块,处理程序或Global.asax应用程序方法要求Windsor进行ISession?