Динамический поставщик состояния сеанса
Я хочу динамически менять поставщика состояния сеанса при загрузке веб-страницы.
Локально, при разработке, мы используем следующее:
<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 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 являются частью более широкой группы параметров, которые можно настроить для автоматизации процесса развертывания. Сведения о задачах, связанных с настройкой автоматического развертывания, см. В следующих разделах:
Вы можете добиться этого, используя 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);
}