2013-07-22 1 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 Config Transformations, чтобы сделать это. У вас будет одна конфигурация для построения в режиме отладки и одна для релизов. Как мы это делаем, мы имеем Web.Base.Config, который содержит большинство материалов и заполнителей для уникальных битов, которые хранятся в Интернете .Dev.Config и Web.Release.Config. –

+1

http://msdn.microsoft.com/en-us/library/dd465326.aspx - Синтаксис преобразования Web.config для развертывания веб-проектов с использованием Visual Studio –

+1

Спасибо Джейми. Теперь я использую преобразования web.config. Пожалуйста, сделайте ответ, чтобы я согласился. – davenewza

ответ

2

Для достижения этой цели вы можете использовать преобразования Web Config.

Это позволит вам указать разделы преобразования в вашем 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

Вы можете достичь этого с помощью 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); 
}