2011-11-27 77 views
1

我一直在開發一個ASP.Net 4.0 web應用程序,並且我用HttpApplicationState類的Contents屬性在Global_asax文件的Application_Start事件中設置了一些變量。.Net 4.0和IIS7下的應用程序狀態不起作用

雖然應用程序在我的開發計算機上按預期運行,但當它在運行IIS7的生產服務器上部署時,爲應用程序狀態變量返回的值爲null。我嘗試了各種代碼技術,例如使用HttpContext,Runtime.Cache,Application [「key」]和Application.Contents.Add [「key」,Value],都沒有成功。我現在想知道在IIS7上是否應該有一個特殊的配置,研究這個主題我發現人們說應用程序在其中執行的應用程序池必須僅由單個工作進程提供服務;我不是IIS7的專家,但選擇應用程序池,並查看其高級屬性,我可以看到該池被配置爲最多有1個工作進程,所以我認爲這應該覆蓋它。我花了兩天時間,所以如果有人對這個問題有任何瞭解,請幫忙!

感謝

克里斯

回答

0

這可能是你沒有正確的應用程序池模式。

IIS 7應用程序池有2種模式,經典和集成。看到。 http://weblogs.asp.net/jgaylord/archive/2008/09/04/iis7-integrated-mode-and-global-asax.aspx

+0

謝謝,我把模式切換到了經典;這些變量似乎現在有價值;但是該頁面沒有任何樣式信息!有沒有人可以用經典模式做到正常服務應用程序? – user1012598

+0

我還沒有看到之前在經典和集成之間切換的效果。您可以檢查您的部署是否擁有所有文件。有關模式之間的差異,請參閱http://stackoverflow.com/questions/716049/what-is-the-difference-between-classic-and-integrated-in-iis7。 –

+0

感謝您的支持;你提示我查看應用程序池模式和使用應用程序狀態之間可能的關聯;看起來集成模式不訪問Application_Start事件;然而,試圖在傳統模式應用程序池下運行該網站導致年齡未正確發送(沒有發送樣式信息)。所以我害怕回到原點。由於時間不夠,我不得不退回到使用會話狀態(如果你問我,相當浪費);如果任何人有任何想法如何處理這件事請讓我知道。 – user1012598

1
  1. HttpContext.Current.Application可用於IIS 6和7,集成模式或經典模式。

  2. global.asax中的Application_Start事件也在所有環境中調用。

  3. 在集成模式下運行IIS 7+時,global.asax中的事件處理程序僅應用於映射到ASP.NET處理程序(從Page類派生的對象)的請求。自定義HttpModules適用於所有請求。

  4. 應用程序狀態或任何其他靜態變量不會從IIS的一個實例共享到另一個實例 - 因此一個AppPool或工作進程中的設置在其他實例中不可見。

  5. 應用程序狀態和初始化後的靜態變量設置可在應用程序池重置丟失(儘管你也將獲得一個新的Application_Start事件)。不管重置是由於工人閒置還是通常的日常重置都是如此。

  6. 而不是使用HttpApplicationState的,這是更好地創建自己的靜態類,與應用程序範圍內的設置靜態屬性。這樣,您的訪問是強類型的,具有Intellisense,並且不容易拼錯關鍵字符串。

  7. 無論是使用自己的靜態類或HttpApplicationState,請務必閱讀設置時也可能會改變之前設置的鎖。如果你決定採用這種方法,你可以使用HttpApplicationState.Lock()。

你可以嘗試下運行IIS Express的應用程序在本地,甚至IIS 7(Vista)或7.5(W7),以幫助調試您的問題。卡西尼現階段已棄用;我會盡量避免使用它。

+0

感謝您的意見;所以下面的6.上面哪裏是一個安全的地方創建可以被應用程序中的所有其他類訪問的靜態類?應用程序的根目錄是不錯的選擇?順便說一句我上週只買了你的書「Ulra-Fast ASP.NET」! – user1012598

+0

在一個Web應用程序中幾乎可以在任何地方使用;只是儘量保持它在你的應用程序的大部分相同的命名空間。對於一個網站,它應該在App_Code文件夾中。我希望你喜歡這本書。 – RickNZ