Some prerequisites ...
I saw the answers using the ConfigurationManager, but I think what I'm trying to achieve is a little different.
I am deploying MVC5 as an Azure cloud service. The customer would like to receive a single delivery package for testing / user acceptance / Live with all (if possible) settings saved in the Azure configuration settings. For our own values, appSettings is not a problem, move them to ServiceConfiguration.cscfg and read them with a call CloudConfigurationManager.GetSetting(which reads from Azure cscfg if it is deployed as Azure, or web.config if it runs locally in IIS during dev)
However, there is still a problem with Microsoft.Web.RedisSessionStateProvider - which only supports reading options from web.config (I emailed Devs and they confirmed it)
I got around this by reading the connection string from ServiceConfiguration.cscfg on Azure and typing it into in-memory web.config as follows, which seemed like a viable way to let MVC do its own session processing configuration.
private void UpdateConfigurationSettings()
{
var runtimeConfig = Type.GetType("System.Web.Configuration.RuntimeConfig, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
var runtimeConfigInstance = runtimeConfig.GetMethod("GetAppConfig", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, null);
UpdateRedisSessionStateSettings(runtimeConfig, runtimeConfigInstance);
UpdateAppSettings(runtimeConfig, runtimeConfigInstance);
}
private static void UpdateRedisSessionStateSettings(Type runtimeConfig, object runtimeConfigInstance)
{
SessionStateSection sessionStateSection =
(SessionStateSection)
runtimeConfig.GetProperty("SessionState", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(runtimeConfigInstance, null);
typeof (ConfigurationElement).GetField("_bReadOnly", BindingFlags.NonPublic | BindingFlags.Instance)
.SetValue(sessionStateSection, false);
var provider = sessionStateSection.Providers[0];
typeof (ConfigurationElement).GetField("_bReadOnly", BindingFlags.NonPublic | BindingFlags.Instance)
.SetValue(provider, false);
provider.Parameters.Set("connectionString", ConfigurationParameters.RedisCacheConnectionString);
var c = provider.Parameters["connectionString"];
}
The problem is Active Directory
My real problem now is in Azure Active Directory settings, and I was hoping to do a similar thing, but I cannot access the appSettings section using the same method. Trying to read appSettings as follows gives a null pointer, and indeed, if you are debugging in runtimeConfigInstance, then every other section is available, but not appSettings!
private void UpdateAppSettings(Type runtimeConfig, object runtimeConfigInstance)
{
AppSettingsSection appSettingsSection =
(AppSettingsSection)
runtimeConfig.GetProperty("appSettings", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(runtimeConfigInstance, null);
typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.NonPublic | BindingFlags.Instance)
.SetValue(appSettingsSection, false);
}
, :
appSettings , ConfigurationManager ?
Active Directory Azure, web.config, , , Azure?
. FederationConfiguration , cscfg, appSettings ida:FederationMetadataLocation ida:Realm ida:AudienceUri web.config ..
private void FederatedAuthenticationOnFederationConfigurationCreated(object sender, FederationConfigurationCreatedEventArgs args)
{
args.FederationConfiguration.IdentityConfiguration.AudienceRestriction.AllowedAudienceUris[0] = new Uri(ConfigurationParameters.ActiveDirectoryAudienceUri);
args.FederationConfiguration.WsFederationConfiguration.Issuer = ConfigurationParameters.ActiveDirectoryIssuer;
args.FederationConfiguration.WsFederationConfiguration.Realm = ConfigurationParameters.ActiveDirectoryRealm;
}