我有一個使用NHibernate進行數據訪問的ASP.net MVC2應用程序。在每個請求中,即使是靜態文件請求(圖像,JavaScript),新會話也正在創建。因此,對於我要返回列表的單個視圖,我創建了大約15個不加載任何內容的會話。在asp.net中的每個web請求上創建的nhibernate會話MVC2
是否有辦法在需要時創建會話?
我目前使用Castle.Windsor將會話注入到我的控制器中。
有沒有辦法過濾出靜態文件請求?
我有一個使用NHibernate進行數據訪問的ASP.net MVC2應用程序。在每個請求中,即使是靜態文件請求(圖像,JavaScript),新會話也正在創建。因此,對於我要返回列表的單個視圖,我創建了大約15個不加載任何內容的會話。在asp.net中的每個web請求上創建的nhibernate會話MVC2
是否有辦法在需要時創建會話?
我目前使用Castle.Windsor將會話注入到我的控制器中。
有沒有辦法過濾出靜態文件請求?
我也想通了,這是不是與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運行時。
這聽起來像你需要排除在你的路由這些路徑:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// add these lines
routes.IgnoreRoute("{resource}.jpg");
routes.IgnoreRoute("{resource}.js");
}
但如果你問我,對靜態文件的請求不應該被實例化一個控制器。你可能想看看你的代碼,並找出它爲什麼這樣做。
你怎麼創建會話,因爲.jpg不應該要求一個ISession的實例,因此城堡不會創建一個(從我的理解),你可以發佈城堡設置,你是如何實現它作爲一個工廠?
事情看出來的
創建一個會話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如果有幫助
我使用Spring.NET,而不是Castle Windsor,但我認爲概念是相同的。你的ISession的範圍應該根據請求來定義,並且不應該直到被要求時才被創建,就像Dbones所說的那樣。雖然MVC處理每個請求,但請求.jpg不應該擊中依賴於ISession的控制器。
是溫莎城堡熱切地創建每個請求對象而不是按需?這可能是一個配置問題。或者你有一個自定義模塊,處理程序或向Windsor索要ISession的Global.asax應用程序方法嗎?
上的Transient的PerWebRequest,當控制器依賴於ISession時,只有'OpenSession'。聽起來你正在盲目地在全局BeginRequest中打開一個會話。我不是那個粉絲。 – dotjoe 2010-11-11 01:15:16
這也發生在新的IIS Express上。 – 2011-03-31 19:40:01