2010-11-10 78 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應用程序方法嗎?

相關問題