Динамический поставщик состояния сеанса

Я хочу динамически менять поставщика состояния сеанса при загрузке веб-страницы.

Локально, при разработке, мы используем следующее:

<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);
}
Другие вопросы по тегам