2013-07-22 99 views
0

我希望在網頁加載時動態更改會話狀態提供程序。動態會話狀態提供程序

本地,而發展中國家,我們使用以下命令:

<sessionState mode="InProc" /> 

但生產代碼的運行是這樣的:

<sessionState mode="Custom" customProvider="CustomSessionStateProvider"> 
    <providers> 
    <add name="CustomSessionStateProvider" type="Library.CustomSessionStateProvider" applicationName="AppName" /> 
    </providers> 
</sessionState> 

是沒可能改變其供應商將sessionState前在運行時使用頁面加載?它會通過某種配置項的決定:

if(Environmental.IsProduction) 
{ 
    // Use custom provider 
} 
else 
{ 
    // Use InProc 
} 

我們做每使用環境不同的配置文件,不過這個功能需要在所有環境下都可用。

+2

您可以使用Web配置轉換來做到這一點。您將在調試模式下創建一個配置,在發佈版本中創建一個配置。我們在此執行的方式是,我們有一個Web.Base.Config,其中包含存儲在Web中的唯一位的大部分內容和佔位符.Dev.Config和Web.Release.Config。 –

+1

http://msdn.microsoft.com/en-us/library/dd465326.aspx - 使用Visual Studio進行Web項目部署的Web.config轉換語法 –

+1

感謝Jamie。我正在使用web.config轉換。請回答,以便我可以接受。 – davenewza

回答

2

您可以使用Web配置轉換來實現此目的。

這將允許您在web.config中指定變換部分,併爲構建期間替換變換標記的不同環境提供單獨的文件。

此處瞭解詳情:http://msdn.microsoft.com/en-us/library/dd465318%28v=vs.100%29.aspx

當部署一個網站,你經常要在 部署的應用程序的Web.config文件中的一些設置是從 發展Web.config文件不同。例如,您可能想要禁用 調試選項並更改連接字符串,以便它們指向 不同的數據庫。本主題將介紹如何設置在部署期間自動應用的Web.config 轉換文件,以便對部署的Web.config文件版本進行更改以在 中進行部署。

Web.config轉換是您可以配置爲自動執行部署過程的更廣泛組設置的一部分。有關參與設立自動部署的任務信息 , 請參閱以下主題:

2

你可以做到這一點使用反射:

protected void Application_Start() { 
    var privateFieldFlags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic; 

    //Get session state section 
    var sessionStateSection = ConfigurationManager.GetSection("system.web/sessionState") as SessionStateSection; 
    var values = typeof(ConfigurationElement).GetField("_values", privateFieldFlags).GetValue(sessionStateSection); 
    var entriesArray = values.GetType().BaseType.GetField("_entriesArray", privateFieldFlags).GetValue(values); 

    //Get "Mode" entry (index: 2) 
    var modeEntry = (entriesArray as System.Collections.ArrayList)[2]; 
    var entryValue = modeEntry.GetType().GetField("Value", privateFieldFlags).GetValue(modeEntry); 

    //Change entry value to InProc 
    entryValue.GetType() 
      .GetField("Value", privateFieldFlags) 
      .SetValue(entryValue, System.Web.SessionState.SessionStateMode.InProc); 
} 
相關問題