2009-12-02 24 views
2

看來,CompilationMode =永不不允許會話正確連線。CompilationMode =從不&SessionState

它首先抱怨在此頁面上不允許指令EnbaleSessionState指令。

顯式指派的System.Web.SessionState.IRequiresSessionState到第[1]避免了空引用異常(周圍.Session訪問),但仍不會保留或線性會議正確。

是否有人成功使用ASP.NET會話CompilationMode =從不

概念上,爲什麼這些應該是不相交的?

[1] - http://msdn.microsoft.com/en-us/library/system.web.ui.compilationmode.aspx

回答

2

我不知道確切的情況下,你都在,但你說的是正確的 - 頁+ IRequiresSessionState =會話中可用。這是你做的。在NoCompile頁

public class BasePage : Page, IRequiresSessionState 
{ 
} 

然後你做以下聲明:首先定義一個基類爲您的網頁將接收會話狀態

<%@ Page Language="C#" CompilationMode="Never" Inherits="BasePage" %> 

按預期工作。會話狀態可用。現在再多談一點你的第二個問題:「從概念上講,爲什麼這些不相交?」。 默認頁面

public class Page : TemplateControl, IHttpHandler 
{ 
} 

類未實現IRequiresSessionState因此沒有會​​話狀態。 ASP.NET爲你做的是在運行時爲你編譯一個類,通過它提供會話 - 也就是說,如果我定義了一個名爲Default.aspx的頁面,其中的代碼落在實現頁面的類後面,無處我明確實現了IRequiresSessionState。但ASP.NET將我們的Default.aspx UI編譯成一個名爲

public class default_aspx : Default, IRequiresSessionState, IHttpHandler 
{ 
} 

現在明確表示它希望傳遞會話狀態。這是因爲@頁面指令中的「EnbaleSessionState」默認設置爲True。現在,當您通過指定CompilationMode="Never"指出default.aspx是非編譯單元時,則永遠不會生成此類,並且您永遠不會獲得會話狀態,這會使「EnbaleSessionState」變得無意義並因此被禁用。