2010-11-10 49 views
3

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

是否有办法在需要时创建会话?

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

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

回答

3

我也想通了,这是不是与NHibernate或MVC的配置。 ASP.net开发服务器通过ASP.net为每个请求提供服务。除非配置IIS,否则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页面,图像, 或JavaScript文件,ASP.NET Development Server的所有请求 , 都由ASP.NET运行时的 进行处理。默认情况下,当 请求用于ASP.NET 资源(如ASP.NET网页, Web Service等)时,IIS 仅调用ASP.NET运行时。请求 用于静态内容 - 图像,CSS 文件,JavaScript文件,PDF文件, ZIP文件等 - 都是 ,由IIS检索而不涉及 ASP.NET运行时。

+0

上的Transient的PerWebRequest,当控制器依赖于ISession时,只有'OpenSession'。听起来你正在盲目地在全局BeginRequest中打开一个会话。我不是那个粉丝。 – dotjoe 2010-11-11 01:15:16

+0

这也发生在新的IIS Express上。 – 2011-03-31 19:40:01

3

这听起来像你需要排除在你的路由这些路径:

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

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

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

1

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

事情看出来的

  1. 确保您的会话工厂是一个单
  2. 创建一个会话PerWebRequest,使用的openSession通过SessionFactory

    //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()) 
         ); 
    

    一旦你registerd使用MVC作为控制器工厂的城堡,它应该只创建一个会话PerWebRequest,并且只有当控制器或其依赖者依赖于它时才会创建一个会话

我有一个样品app如果有帮助

+0

Container = new WindsorContainer(); – Fran 2010-11-10 22:27:01

+0

有趣,我不知道什么MvcApplication.CurrentSession,我猜它是静态的(我不是静态的Web应用程序的粉丝)。回到代码,尝试改变为ISession – dbones 2010-11-10 22:47:49

0

我使用Spring.NET,而不是Castle Windsor,但我认为概念是相同的。你的ISession的范围应该根据请求来定义,并且不应该直到被要求时才被创建,就像Dbones所说的那样。虽然MVC处理每个请求,但请求.jpg不应该击中依赖于ISession的控制器。

是温莎城堡热切地创建每个请求对象而不是按需?这可能是一个配置问题。或者你有一个自定义模块,处理程序或向Windsor索要ISession的Global.asax应用程序方法吗?

相关问题