我希望在加载网页时动态更改会话状态提供程序。
在本地,在开发过程中,我们使用以下内容:
<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
}
我们确实为每个环境使用不同的配置文件,但此功能需要在所有环境中都可用。
答案 0 :(得分:2)
您可以使用Web Config Transformations来实现此目的。
这将允许您在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转换是您的更广泛设置组的一部分 可以配置为自动化部署过程。有关信息 关于设置自动部署所涉及的任务, 请参阅以下主题:
答案 1 :(得分:2)
您可以使用Reflection:
实现此目的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);
}