我有一个使用NHibernate进行数据访问的ASP.net MVC2应用程序。在每个请求上,即使是静态文件请求(图像,javascript),也会创建一个新会话。因此,对于我正在返回列表的单个视图,我创建了大约15个不加载任何内容的会话。
是否只能在需要时创建会话?
我目前正在使用Castle.Windsor将会话注入我的控制器。
有没有办法过滤掉静态文件请求?
答案 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的实例,因此城堡不会创建一个(根据我的理解),你可以发布城堡设置,你是如何实现它的工厂?
要注意的事项
使用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,并且只有当控制器或其依赖者依赖它时
我有一个示例app,如果它有帮助
答案 3 :(得分:0)
我使用Spring.NET,而不是Castle Windsor,但我认为概念是相同的。 ISession的范围应该根据请求定义,并且在被要求之前不应该实际创建,正如dbones所说的那样。当MVC处理每个请求时,要求.jpg不应该击中依赖于ISession的控制器。
Castle Windsor是否热切地根据请求对象而不是按需创建?这可能是配置问题。或者您是否有自定义模块,处理程序或Global.asax应用程序方法要求Windsor进行ISession?