Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / fx / src / xsp / System / Web / Configuration / RuntimeConfig.cs / 1 / RuntimeConfig.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- using System.Collections; using System.Configuration; using System.Configuration.Internal; using System.Security; using System.Security.Permissions; using System.Web; using System.Web.Util; using System.Web.Hosting; using System.Web.Configuration; namespace System.Web.Configuration { // // Internal, read-only access to configuration settings. // internal class RuntimeConfig { // // GetConfig() - get configuration appropriate for the current thread. // // Looks up the HttpContext on the current thread if it is available, // otherwise it uses the config at the app path. // // Use GetConfig(context) if a context is available, as it will avoid // the lookup for contxt on the current thread. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetConfig() { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } HttpContext context = HttpContext.Current; if (context != null) { return GetConfig(context); } else { return GetAppConfig(); } } // // GetConfig(context) - gets configuration appropriate for the HttpContext. // The most efficient way to get config. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetConfig(HttpContext context) { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } return context.GetRuntimeConfig(); } // // GetConfig(context, path) - returns the config at 'path'. // // This method is more efficient than not using context, as // the config cached in the context is used if it matches the // context path. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetConfig(HttpContext context, VirtualPath path) { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } return context.GetRuntimeConfig(path); } // // GetConfig(path) - returns the config at 'path'. // // If 'path' is null, or is outside of the application path, then it // returns the application config. // // For efficientcy, use GetConfig(context) instead of this method // where possible. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetConfig(string path) { return GetConfig(VirtualPath.CreateNonRelativeAllowNull(path)); } static internal RuntimeConfig GetConfig(VirtualPath path) { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } return CachedPathData.GetVirtualPathData(path, true).RuntimeConfig; } // // GetAppConfig() - returns the application config. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetAppConfig() { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } return CachedPathData.GetApplicationPathData().RuntimeConfig; } // // GetRootWebConfig() - returns the root web configuration. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetRootWebConfig() { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } return CachedPathData.GetRootWebPathData().RuntimeConfig; } // // GetMachineConfig() - returns the machine configuration. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetMachineConfig() { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } return CachedPathData.GetMachinePathData().RuntimeConfig; } // // GetLKGConfig(context) - gets the nearest configuration available. // // This method is to be used in the few instances where we // cannot throw an exception if a config file has an error. // // This method will never throw an exception. If no config // is available, a request for a section will return null. // static internal RuntimeConfig GetLKGConfig(HttpContext context) { RuntimeConfig config = null; bool success = false; try { config = GetConfig(context); success = true; } catch { } if (!success) { config = GetLKGRuntimeConfig(context.Request.FilePathObject); } return config.RuntimeConfigLKG; } // // GetAppLKGConfig(path) - gets the nearest configuration available, // starting from the application path. // // This method is to be used in the few instances where we // cannot throw an exception if a config file has an error. // // This method will never throw an exception. If no config // is available, a request for a section will return null. // static internal RuntimeConfig GetAppLKGConfig() { RuntimeConfig config = null; bool success = false; try { config = GetAppConfig(); success = true; } catch { } if (!success) { config = GetLKGRuntimeConfig(System.Web.Hosting.HostingEnvironment.ApplicationVirtualPathObject); } return config.RuntimeConfigLKG; } // // WHIDBEY sections // internal ConnectionStringsSection ConnectionStrings { get { return (ConnectionStringsSection) GetSection("connectionStrings", typeof(ConnectionStringsSection), ResultsIndex.ConnectionStrings); } } internal System.Net.Configuration.SmtpSection Smtp { get { return (System.Net.Configuration.SmtpSection) GetSection("system.net/mailSettings/smtp", typeof(System.Net.Configuration.SmtpSection)); } } internal AnonymousIdentificationSection AnonymousIdentification { get { return (AnonymousIdentificationSection) GetSection("system.web/anonymousIdentification", typeof(AnonymousIdentificationSection)); } } internal ProtocolsSection Protocols { get { return (ProtocolsSection) GetSection("system.web/protocols", typeof(ProtocolsSection)); } } internal AuthenticationSection Authentication { get { return (AuthenticationSection) GetSection("system.web/authentication", typeof(AuthenticationSection), ResultsIndex.Authentication); } } internal AuthorizationSection Authorization { get { return (AuthorizationSection) GetSection("system.web/authorization", typeof(AuthorizationSection), ResultsIndex.Authorization); } } // may return null internal HttpCapabilitiesEvaluator BrowserCaps { get { return (HttpCapabilitiesEvaluator) GetHandlerSection("system.web/browserCaps", typeof(HttpCapabilitiesEvaluator), ResultsIndex.BrowserCaps); } } internal ClientTargetSection ClientTarget { get { return (ClientTargetSection) GetSection("system.web/clientTarget", typeof(ClientTargetSection), ResultsIndex.ClientTarget); } } internal CompilationSection Compilation { get { return (CompilationSection) GetSection("system.web/compilation", typeof(CompilationSection), ResultsIndex.Compilation); } } internal CustomErrorsSection CustomErrors { get { return (CustomErrorsSection) GetSection("system.web/customErrors", typeof(CustomErrorsSection)); } } internal GlobalizationSection Globalization { get { return (GlobalizationSection) GetSection("system.web/globalization", typeof(GlobalizationSection), ResultsIndex.Globalization); } } internal DeploymentSection Deployment { get { return (DeploymentSection) GetSection("system.web/deployment", typeof(DeploymentSection)); } } internal HealthMonitoringSection HealthMonitoring { get { return (HealthMonitoringSection) GetSection("system.web/healthMonitoring", typeof(HealthMonitoringSection)); } } internal HostingEnvironmentSection HostingEnvironment { get { return (HostingEnvironmentSection) GetSection("system.web/hostingEnvironment", typeof(HostingEnvironmentSection)); } } internal HttpCookiesSection HttpCookies { get { return (HttpCookiesSection) GetSection("system.web/httpCookies", typeof(HttpCookiesSection), ResultsIndex.HttpCookies); } } internal HttpHandlersSection HttpHandlers { get { return (HttpHandlersSection) GetSection("system.web/httpHandlers", typeof(HttpHandlersSection), ResultsIndex.HttpHandlers); } } internal HttpModulesSection HttpModules { get { return (HttpModulesSection) GetSection("system.web/httpModules", typeof(HttpModulesSection), ResultsIndex.HttpModules); } } internal HttpRuntimeSection HttpRuntime { get { return (HttpRuntimeSection) GetSection("system.web/httpRuntime", typeof(HttpRuntimeSection), ResultsIndex.HttpRuntime); } } internal IdentitySection Identity { get { return (IdentitySection) GetSection("system.web/identity", typeof(IdentitySection), ResultsIndex.Identity); } } internal MachineKeySection MachineKey { get { return (MachineKeySection) GetSection("system.web/machineKey", typeof(MachineKeySection), ResultsIndex.MachineKey); } } internal MembershipSection Membership { get { return (MembershipSection) GetSection("system.web/membership", typeof(MembershipSection), ResultsIndex.Membership); } } internal PagesSection Pages { get { return (PagesSection) GetSection("system.web/pages", typeof(PagesSection), ResultsIndex.Pages); } } internal ProcessModelSection ProcessModel { get { return (ProcessModelSection) GetSection("system.web/processModel", typeof(ProcessModelSection)); } } internal ProfileSection Profile { get { return (ProfileSection) GetSection("system.web/profile", typeof(ProfileSection), ResultsIndex.Profile); } } internal RoleManagerSection RoleManager { get { return (RoleManagerSection) GetSection("system.web/roleManager", typeof(RoleManagerSection)); } } internal SecurityPolicySection SecurityPolicy { get { return (SecurityPolicySection) GetSection("system.web/securityPolicy", typeof(SecurityPolicySection)); } } internal SessionPageStateSection SessionPageState { get { return (SessionPageStateSection) GetSection("system.web/sessionPageState", typeof(SessionPageStateSection), ResultsIndex.SessionPageState); } } internal SessionStateSection SessionState { get { return (SessionStateSection) GetSection("system.web/sessionState", typeof(SessionStateSection)); } } internal SiteMapSection SiteMap { get { return (SiteMapSection) GetSection("system.web/siteMap", typeof(SiteMapSection)); } } internal TraceSection Trace { get { return (TraceSection) GetSection("system.web/trace", typeof(TraceSection)); } } internal TrustSection Trust { get { return (TrustSection) GetSection("system.web/trust", typeof(TrustSection)); } } internal UrlMappingsSection UrlMappings { get { return (UrlMappingsSection) GetSection("system.web/urlMappings", typeof(UrlMappingsSection), ResultsIndex.UrlMappings); } } internal Hashtable WebControls { get { return (Hashtable)GetSection("system.web/webControls", typeof(Hashtable), ResultsIndex.WebControls); } } internal WebPartsSection WebParts { get { return (WebPartsSection) GetSection("system.web/webParts", typeof(WebPartsSection), ResultsIndex.WebParts); } } internal XhtmlConformanceSection XhtmlConformance { get { return (XhtmlConformanceSection) GetSection("system.web/xhtmlConformance", typeof(XhtmlConformanceSection), ResultsIndex.XhtmlConformance); } } internal CacheSection Cache { get { return (CacheSection) GetSection("system.web/caching/cache", typeof(CacheSection)); } } internal OutputCacheSection OutputCache { get { return (OutputCacheSection) GetSection("system.web/caching/outputCache", typeof(OutputCacheSection), ResultsIndex.OutputCache); } } internal OutputCacheSettingsSection OutputCacheSettings { get { return (OutputCacheSettingsSection) GetSection("system.web/caching/outputCacheSettings", typeof(OutputCacheSettingsSection), ResultsIndex.OutputCacheSettings); } } internal SqlCacheDependencySection SqlCacheDependency { get { return (SqlCacheDependencySection) GetSection("system.web/caching/sqlCacheDependency", typeof(SqlCacheDependencySection)); } } #if ORCAS internal ImageGenerationSection ImageGeneration { get { return (ImageGenerationSection) GetSection("system.web/imageGeneration", typeof(ImageGenerationSection)); } } #endif #if SITECOUNTERS internal SiteCountersSection SiteCounters { get { return (SiteCountersSection) GetSection("system.web/siteCounters", typeof(SiteCountersSection)); } } #endif // SITECOUNTERS ////////////////////////////// // // IMPLEMENTATION // ////////////////////////////// // Wraps calls to RuntimeConfig.GetConfig() when // the web config system is not being used. private static RuntimeConfig s_clientRuntimeConfig; // Wraps calls to RuntimeConfig.GetConfig() when // we must return null. private static RuntimeConfig s_nullRuntimeConfig; // Wraps calls to RuntimeConfig.GetConfig() when // we must return an error because there was an // unrecoverable error creating the config record. private static RuntimeConfig s_errorRuntimeConfig; // object used to indicate that result has not been evaluated private static object s_unevaluatedResult; // Commonly used results on every request. We cache these by index // into an array so we don't need to do hash table lookups, // type comparisons, and handle a demand for ConfigurationPermission // to retreive the config. internal enum ResultsIndex { // a valid index into the results array that is always unevaluated UNUSED = 0, Authentication, Authorization, BrowserCaps, ClientTarget, Compilation, ConnectionStrings, Globalization, HttpCookies, HttpHandlers, HttpModules, HttpRuntime, Identity, MachineKey, Membership, OutputCache, OutputCacheSettings, Pages, Profile, SessionPageState, WebControls, WebParts, UrlMappings, XhtmlConformance, // size of the results array, must be last in list SIZE }; // cached results // Per-path caching for perf reason. Available only to internal components. private object[] _results; // LKG config private RuntimeConfigLKG _runtimeConfigLKG; // for http configuration, the ConfigurationRecord on which we call GetConfig protected IInternalConfigRecord _configRecord; // classes implementing LKG may return null from GetSectionObject private bool _permitNull; static RuntimeConfig() { s_unevaluatedResult = new object(); // Ensure that we have an error config record available if we // get an unrecoverable error situation. GetErrorRuntimeConfig(); } // ctor used by CachedPathData to wrap the ConfigurationRecord internal RuntimeConfig(IInternalConfigRecord configRecord) : this(configRecord, false) {} protected RuntimeConfig(IInternalConfigRecord configRecord, bool permitNull) { _configRecord = configRecord; _permitNull = permitNull; // initialize results cache _results = new object[(int)ResultsIndex.SIZE]; for (int i = 0; i < _results.Length; i++) { _results[i] = s_unevaluatedResult; } } private RuntimeConfigLKG RuntimeConfigLKG { get { if (_runtimeConfigLKG == null) { lock (this) { if (_runtimeConfigLKG == null) { _runtimeConfigLKG = new RuntimeConfigLKG(_configRecord); } } } return _runtimeConfigLKG; } } internal IInternalConfigRecord ConfigRecord { get { return _configRecord; } } // Create the single instance of the wrapper for ConfigurationManager configuration. static RuntimeConfig GetClientRuntimeConfig() { if (s_clientRuntimeConfig == null) { s_clientRuntimeConfig = new ClientRuntimeConfig(); } return s_clientRuntimeConfig; } // Create the single instance of the wrapper for null configuration. static RuntimeConfig GetNullRuntimeConfig() { if (s_nullRuntimeConfig == null) { s_nullRuntimeConfig = new NullRuntimeConfig(); } return s_nullRuntimeConfig; } // Create the single instance of the wrapper for error configuration. static internal RuntimeConfig GetErrorRuntimeConfig() { if (s_errorRuntimeConfig == null) { s_errorRuntimeConfig = new ErrorRuntimeConfig(); } return s_errorRuntimeConfig; } // Get the config object for a section [ConfigurationPermission(SecurityAction.Assert, Unrestricted=true)] protected virtual object GetSectionObject(string sectionName) { return _configRecord.GetSection(sectionName); } #if UNUSED_CODE // Get config for config data implemented by IConfigurationHandler private object GetHandlerSection(string sectionName, Type type) { return GetHandlerSection(sectionName, type, ResultsIndex.UNUSED); } #endif // // Return a config implemented by IConfigurationHandler, // and use the runtime cache to store it for quick retreival without // having to hit a config record and a demand for ConfigurationPermission. // private object GetHandlerSection(string sectionName, Type type, ResultsIndex index) { // check the results cache object result = _results[(int)index]; if (result != s_unevaluatedResult) { return result; } // Get the configuration object. // // Note that it is legal for an IConfigurationSectionHandler implementation // to return null. result = GetSectionObject(sectionName); // verify the object is of the expected type if (result != null && result.GetType() != type) { throw new ConfigurationErrorsException(SR.GetString(SR.Config_unable_to_get_section, sectionName)); } // store into results cache if (index != ResultsIndex.UNUSED) { _results[(int)index] = result; } return result; } // // Return a configuration section without checking the runtime cache. // private object GetSection(string sectionName, Type type) { return GetSection(sectionName, type, ResultsIndex.UNUSED); } // // Return a configuration section, and use the runtime cache to store it for // quick retreival without having to hit a config record and a demand for // ConfigurationPermission. // private object GetSection(string sectionName, Type type, ResultsIndex index) { // check the results cache object result = _results[(int)index]; if (result != s_unevaluatedResult) { return result; } // get the configuration object result = GetSectionObject(sectionName); if (result == null) { // A section implemented by ConfigurationSection may not return null, // but various error handling subclasses of RuntimeConfig may need it. // Throw an error if null is not permitted. if (!_permitNull) { throw new ConfigurationErrorsException(SR.GetString(SR.Config_unable_to_get_section, sectionName)); } } else { // verify the object is of the expected type if (result.GetType() != type) { throw new ConfigurationErrorsException(SR.GetString(SR.Config_unable_to_get_section, sectionName)); } } // store into results cache if (index != ResultsIndex.UNUSED) { _results[(int)index] = result; } return result; } // // There are extreme cases where we cannot even retreive the CachedPathData // for a path - such as when MapPath deems the path to be suspicious. // In these cases, walk the hierarchy upwards until we are able to retreive // a CachedPathData and its associated RuntimeConfig. // static private RuntimeConfig GetLKGRuntimeConfig(VirtualPath path) { try { // Start with the parent of the path. path = path.Parent; } catch { path = System.Web.Hosting.HostingEnvironment.ApplicationVirtualPathObject; } // Walk the path hierarchy until we can succesfully get a RuntimeConfig. while (path != null) { try { return GetConfig(path); } catch { path = path.Parent; } } try { return GetRootWebConfig(); } catch { } try { return GetMachineConfig(); } catch { } return GetNullRuntimeConfig(); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- using System.Collections; using System.Configuration; using System.Configuration.Internal; using System.Security; using System.Security.Permissions; using System.Web; using System.Web.Util; using System.Web.Hosting; using System.Web.Configuration; namespace System.Web.Configuration { // // Internal, read-only access to configuration settings. // internal class RuntimeConfig { // // GetConfig() - get configuration appropriate for the current thread. // // Looks up the HttpContext on the current thread if it is available, // otherwise it uses the config at the app path. // // Use GetConfig(context) if a context is available, as it will avoid // the lookup for contxt on the current thread. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetConfig() { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } HttpContext context = HttpContext.Current; if (context != null) { return GetConfig(context); } else { return GetAppConfig(); } } // // GetConfig(context) - gets configuration appropriate for the HttpContext. // The most efficient way to get config. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetConfig(HttpContext context) { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } return context.GetRuntimeConfig(); } // // GetConfig(context, path) - returns the config at 'path'. // // This method is more efficient than not using context, as // the config cached in the context is used if it matches the // context path. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetConfig(HttpContext context, VirtualPath path) { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } return context.GetRuntimeConfig(path); } // // GetConfig(path) - returns the config at 'path'. // // If 'path' is null, or is outside of the application path, then it // returns the application config. // // For efficientcy, use GetConfig(context) instead of this method // where possible. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetConfig(string path) { return GetConfig(VirtualPath.CreateNonRelativeAllowNull(path)); } static internal RuntimeConfig GetConfig(VirtualPath path) { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } return CachedPathData.GetVirtualPathData(path, true).RuntimeConfig; } // // GetAppConfig() - returns the application config. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetAppConfig() { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } return CachedPathData.GetApplicationPathData().RuntimeConfig; } // // GetRootWebConfig() - returns the root web configuration. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetRootWebConfig() { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } return CachedPathData.GetRootWebPathData().RuntimeConfig; } // // GetMachineConfig() - returns the machine configuration. // // For config derived from ConfigurationSection, this will either // return a non-null object or throw an exception. // // For config implemented with IConfigurationSectionHandler, this // may return null, non-null, or throw an exception. // static internal RuntimeConfig GetMachineConfig() { if (!HttpConfigurationSystem.UseHttpConfigurationSystem) { return GetClientRuntimeConfig(); } return CachedPathData.GetMachinePathData().RuntimeConfig; } // // GetLKGConfig(context) - gets the nearest configuration available. // // This method is to be used in the few instances where we // cannot throw an exception if a config file has an error. // // This method will never throw an exception. If no config // is available, a request for a section will return null. // static internal RuntimeConfig GetLKGConfig(HttpContext context) { RuntimeConfig config = null; bool success = false; try { config = GetConfig(context); success = true; } catch { } if (!success) { config = GetLKGRuntimeConfig(context.Request.FilePathObject); } return config.RuntimeConfigLKG; } // // GetAppLKGConfig(path) - gets the nearest configuration available, // starting from the application path. // // This method is to be used in the few instances where we // cannot throw an exception if a config file has an error. // // This method will never throw an exception. If no config // is available, a request for a section will return null. // static internal RuntimeConfig GetAppLKGConfig() { RuntimeConfig config = null; bool success = false; try { config = GetAppConfig(); success = true; } catch { } if (!success) { config = GetLKGRuntimeConfig(System.Web.Hosting.HostingEnvironment.ApplicationVirtualPathObject); } return config.RuntimeConfigLKG; } // // WHIDBEY sections // internal ConnectionStringsSection ConnectionStrings { get { return (ConnectionStringsSection) GetSection("connectionStrings", typeof(ConnectionStringsSection), ResultsIndex.ConnectionStrings); } } internal System.Net.Configuration.SmtpSection Smtp { get { return (System.Net.Configuration.SmtpSection) GetSection("system.net/mailSettings/smtp", typeof(System.Net.Configuration.SmtpSection)); } } internal AnonymousIdentificationSection AnonymousIdentification { get { return (AnonymousIdentificationSection) GetSection("system.web/anonymousIdentification", typeof(AnonymousIdentificationSection)); } } internal ProtocolsSection Protocols { get { return (ProtocolsSection) GetSection("system.web/protocols", typeof(ProtocolsSection)); } } internal AuthenticationSection Authentication { get { return (AuthenticationSection) GetSection("system.web/authentication", typeof(AuthenticationSection), ResultsIndex.Authentication); } } internal AuthorizationSection Authorization { get { return (AuthorizationSection) GetSection("system.web/authorization", typeof(AuthorizationSection), ResultsIndex.Authorization); } } // may return null internal HttpCapabilitiesEvaluator BrowserCaps { get { return (HttpCapabilitiesEvaluator) GetHandlerSection("system.web/browserCaps", typeof(HttpCapabilitiesEvaluator), ResultsIndex.BrowserCaps); } } internal ClientTargetSection ClientTarget { get { return (ClientTargetSection) GetSection("system.web/clientTarget", typeof(ClientTargetSection), ResultsIndex.ClientTarget); } } internal CompilationSection Compilation { get { return (CompilationSection) GetSection("system.web/compilation", typeof(CompilationSection), ResultsIndex.Compilation); } } internal CustomErrorsSection CustomErrors { get { return (CustomErrorsSection) GetSection("system.web/customErrors", typeof(CustomErrorsSection)); } } internal GlobalizationSection Globalization { get { return (GlobalizationSection) GetSection("system.web/globalization", typeof(GlobalizationSection), ResultsIndex.Globalization); } } internal DeploymentSection Deployment { get { return (DeploymentSection) GetSection("system.web/deployment", typeof(DeploymentSection)); } } internal HealthMonitoringSection HealthMonitoring { get { return (HealthMonitoringSection) GetSection("system.web/healthMonitoring", typeof(HealthMonitoringSection)); } } internal HostingEnvironmentSection HostingEnvironment { get { return (HostingEnvironmentSection) GetSection("system.web/hostingEnvironment", typeof(HostingEnvironmentSection)); } } internal HttpCookiesSection HttpCookies { get { return (HttpCookiesSection) GetSection("system.web/httpCookies", typeof(HttpCookiesSection), ResultsIndex.HttpCookies); } } internal HttpHandlersSection HttpHandlers { get { return (HttpHandlersSection) GetSection("system.web/httpHandlers", typeof(HttpHandlersSection), ResultsIndex.HttpHandlers); } } internal HttpModulesSection HttpModules { get { return (HttpModulesSection) GetSection("system.web/httpModules", typeof(HttpModulesSection), ResultsIndex.HttpModules); } } internal HttpRuntimeSection HttpRuntime { get { return (HttpRuntimeSection) GetSection("system.web/httpRuntime", typeof(HttpRuntimeSection), ResultsIndex.HttpRuntime); } } internal IdentitySection Identity { get { return (IdentitySection) GetSection("system.web/identity", typeof(IdentitySection), ResultsIndex.Identity); } } internal MachineKeySection MachineKey { get { return (MachineKeySection) GetSection("system.web/machineKey", typeof(MachineKeySection), ResultsIndex.MachineKey); } } internal MembershipSection Membership { get { return (MembershipSection) GetSection("system.web/membership", typeof(MembershipSection), ResultsIndex.Membership); } } internal PagesSection Pages { get { return (PagesSection) GetSection("system.web/pages", typeof(PagesSection), ResultsIndex.Pages); } } internal ProcessModelSection ProcessModel { get { return (ProcessModelSection) GetSection("system.web/processModel", typeof(ProcessModelSection)); } } internal ProfileSection Profile { get { return (ProfileSection) GetSection("system.web/profile", typeof(ProfileSection), ResultsIndex.Profile); } } internal RoleManagerSection RoleManager { get { return (RoleManagerSection) GetSection("system.web/roleManager", typeof(RoleManagerSection)); } } internal SecurityPolicySection SecurityPolicy { get { return (SecurityPolicySection) GetSection("system.web/securityPolicy", typeof(SecurityPolicySection)); } } internal SessionPageStateSection SessionPageState { get { return (SessionPageStateSection) GetSection("system.web/sessionPageState", typeof(SessionPageStateSection), ResultsIndex.SessionPageState); } } internal SessionStateSection SessionState { get { return (SessionStateSection) GetSection("system.web/sessionState", typeof(SessionStateSection)); } } internal SiteMapSection SiteMap { get { return (SiteMapSection) GetSection("system.web/siteMap", typeof(SiteMapSection)); } } internal TraceSection Trace { get { return (TraceSection) GetSection("system.web/trace", typeof(TraceSection)); } } internal TrustSection Trust { get { return (TrustSection) GetSection("system.web/trust", typeof(TrustSection)); } } internal UrlMappingsSection UrlMappings { get { return (UrlMappingsSection) GetSection("system.web/urlMappings", typeof(UrlMappingsSection), ResultsIndex.UrlMappings); } } internal Hashtable WebControls { get { return (Hashtable)GetSection("system.web/webControls", typeof(Hashtable), ResultsIndex.WebControls); } } internal WebPartsSection WebParts { get { return (WebPartsSection) GetSection("system.web/webParts", typeof(WebPartsSection), ResultsIndex.WebParts); } } internal XhtmlConformanceSection XhtmlConformance { get { return (XhtmlConformanceSection) GetSection("system.web/xhtmlConformance", typeof(XhtmlConformanceSection), ResultsIndex.XhtmlConformance); } } internal CacheSection Cache { get { return (CacheSection) GetSection("system.web/caching/cache", typeof(CacheSection)); } } internal OutputCacheSection OutputCache { get { return (OutputCacheSection) GetSection("system.web/caching/outputCache", typeof(OutputCacheSection), ResultsIndex.OutputCache); } } internal OutputCacheSettingsSection OutputCacheSettings { get { return (OutputCacheSettingsSection) GetSection("system.web/caching/outputCacheSettings", typeof(OutputCacheSettingsSection), ResultsIndex.OutputCacheSettings); } } internal SqlCacheDependencySection SqlCacheDependency { get { return (SqlCacheDependencySection) GetSection("system.web/caching/sqlCacheDependency", typeof(SqlCacheDependencySection)); } } #if ORCAS internal ImageGenerationSection ImageGeneration { get { return (ImageGenerationSection) GetSection("system.web/imageGeneration", typeof(ImageGenerationSection)); } } #endif #if SITECOUNTERS internal SiteCountersSection SiteCounters { get { return (SiteCountersSection) GetSection("system.web/siteCounters", typeof(SiteCountersSection)); } } #endif // SITECOUNTERS ////////////////////////////// // // IMPLEMENTATION // ////////////////////////////// // Wraps calls to RuntimeConfig.GetConfig() when // the web config system is not being used. private static RuntimeConfig s_clientRuntimeConfig; // Wraps calls to RuntimeConfig.GetConfig() when // we must return null. private static RuntimeConfig s_nullRuntimeConfig; // Wraps calls to RuntimeConfig.GetConfig() when // we must return an error because there was an // unrecoverable error creating the config record. private static RuntimeConfig s_errorRuntimeConfig; // object used to indicate that result has not been evaluated private static object s_unevaluatedResult; // Commonly used results on every request. We cache these by index // into an array so we don't need to do hash table lookups, // type comparisons, and handle a demand for ConfigurationPermission // to retreive the config. internal enum ResultsIndex { // a valid index into the results array that is always unevaluated UNUSED = 0, Authentication, Authorization, BrowserCaps, ClientTarget, Compilation, ConnectionStrings, Globalization, HttpCookies, HttpHandlers, HttpModules, HttpRuntime, Identity, MachineKey, Membership, OutputCache, OutputCacheSettings, Pages, Profile, SessionPageState, WebControls, WebParts, UrlMappings, XhtmlConformance, // size of the results array, must be last in list SIZE }; // cached results // Per-path caching for perf reason. Available only to internal components. private object[] _results; // LKG config private RuntimeConfigLKG _runtimeConfigLKG; // for http configuration, the ConfigurationRecord on which we call GetConfig protected IInternalConfigRecord _configRecord; // classes implementing LKG may return null from GetSectionObject private bool _permitNull; static RuntimeConfig() { s_unevaluatedResult = new object(); // Ensure that we have an error config record available if we // get an unrecoverable error situation. GetErrorRuntimeConfig(); } // ctor used by CachedPathData to wrap the ConfigurationRecord internal RuntimeConfig(IInternalConfigRecord configRecord) : this(configRecord, false) {} protected RuntimeConfig(IInternalConfigRecord configRecord, bool permitNull) { _configRecord = configRecord; _permitNull = permitNull; // initialize results cache _results = new object[(int)ResultsIndex.SIZE]; for (int i = 0; i < _results.Length; i++) { _results[i] = s_unevaluatedResult; } } private RuntimeConfigLKG RuntimeConfigLKG { get { if (_runtimeConfigLKG == null) { lock (this) { if (_runtimeConfigLKG == null) { _runtimeConfigLKG = new RuntimeConfigLKG(_configRecord); } } } return _runtimeConfigLKG; } } internal IInternalConfigRecord ConfigRecord { get { return _configRecord; } } // Create the single instance of the wrapper for ConfigurationManager configuration. static RuntimeConfig GetClientRuntimeConfig() { if (s_clientRuntimeConfig == null) { s_clientRuntimeConfig = new ClientRuntimeConfig(); } return s_clientRuntimeConfig; } // Create the single instance of the wrapper for null configuration. static RuntimeConfig GetNullRuntimeConfig() { if (s_nullRuntimeConfig == null) { s_nullRuntimeConfig = new NullRuntimeConfig(); } return s_nullRuntimeConfig; } // Create the single instance of the wrapper for error configuration. static internal RuntimeConfig GetErrorRuntimeConfig() { if (s_errorRuntimeConfig == null) { s_errorRuntimeConfig = new ErrorRuntimeConfig(); } return s_errorRuntimeConfig; } // Get the config object for a section [ConfigurationPermission(SecurityAction.Assert, Unrestricted=true)] protected virtual object GetSectionObject(string sectionName) { return _configRecord.GetSection(sectionName); } #if UNUSED_CODE // Get config for config data implemented by IConfigurationHandler private object GetHandlerSection(string sectionName, Type type) { return GetHandlerSection(sectionName, type, ResultsIndex.UNUSED); } #endif // // Return a config implemented by IConfigurationHandler, // and use the runtime cache to store it for quick retreival without // having to hit a config record and a demand for ConfigurationPermission. // private object GetHandlerSection(string sectionName, Type type, ResultsIndex index) { // check the results cache object result = _results[(int)index]; if (result != s_unevaluatedResult) { return result; } // Get the configuration object. // // Note that it is legal for an IConfigurationSectionHandler implementation // to return null. result = GetSectionObject(sectionName); // verify the object is of the expected type if (result != null && result.GetType() != type) { throw new ConfigurationErrorsException(SR.GetString(SR.Config_unable_to_get_section, sectionName)); } // store into results cache if (index != ResultsIndex.UNUSED) { _results[(int)index] = result; } return result; } // // Return a configuration section without checking the runtime cache. // private object GetSection(string sectionName, Type type) { return GetSection(sectionName, type, ResultsIndex.UNUSED); } // // Return a configuration section, and use the runtime cache to store it for // quick retreival without having to hit a config record and a demand for // ConfigurationPermission. // private object GetSection(string sectionName, Type type, ResultsIndex index) { // check the results cache object result = _results[(int)index]; if (result != s_unevaluatedResult) { return result; } // get the configuration object result = GetSectionObject(sectionName); if (result == null) { // A section implemented by ConfigurationSection may not return null, // but various error handling subclasses of RuntimeConfig may need it. // Throw an error if null is not permitted. if (!_permitNull) { throw new ConfigurationErrorsException(SR.GetString(SR.Config_unable_to_get_section, sectionName)); } } else { // verify the object is of the expected type if (result.GetType() != type) { throw new ConfigurationErrorsException(SR.GetString(SR.Config_unable_to_get_section, sectionName)); } } // store into results cache if (index != ResultsIndex.UNUSED) { _results[(int)index] = result; } return result; } // // There are extreme cases where we cannot even retreive the CachedPathData // for a path - such as when MapPath deems the path to be suspicious. // In these cases, walk the hierarchy upwards until we are able to retreive // a CachedPathData and its associated RuntimeConfig. // static private RuntimeConfig GetLKGRuntimeConfig(VirtualPath path) { try { // Start with the parent of the path. path = path.Parent; } catch { path = System.Web.Hosting.HostingEnvironment.ApplicationVirtualPathObject; } // Walk the path hierarchy until we can succesfully get a RuntimeConfig. while (path != null) { try { return GetConfig(path); } catch { path = path.Parent; } } try { return GetRootWebConfig(); } catch { } try { return GetMachineConfig(); } catch { } return GetNullRuntimeConfig(); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TabItemAutomationPeer.cs
- LayoutTableCell.cs
- BufferModeSettings.cs
- XPathSelectionIterator.cs
- TypeExtensionSerializer.cs
- ListViewContainer.cs
- clipboard.cs
- RequestSecurityToken.cs
- StrokeSerializer.cs
- ObjectParameterCollection.cs
- TextChange.cs
- CodeExporter.cs
- CreateUserWizardStep.cs
- MappingModelBuildProvider.cs
- Focus.cs
- COM2PropertyBuilderUITypeEditor.cs
- dsa.cs
- ADConnectionHelper.cs
- ConvertTextFrag.cs
- DynamicDiscoSearcher.cs
- BindingExpression.cs
- DataGridView.cs
- ClientSideQueueItem.cs
- XmlWrappingWriter.cs
- QuaternionKeyFrameCollection.cs
- KeyboardNavigation.cs
- DynamicPropertyHolder.cs
- WebRequest.cs
- StringArrayEditor.cs
- ExtentKey.cs
- RuntimeHandles.cs
- DesignerContextDescriptor.cs
- DesignerActionVerbList.cs
- SystemNetworkInterface.cs
- DiscoveryProxy.cs
- HtmlInputControl.cs
- CellParaClient.cs
- BamlTreeNode.cs
- EdmValidator.cs
- DataGridViewColumnCollection.cs
- CodeDOMProvider.cs
- DataGridViewSelectedCellsAccessibleObject.cs
- AdapterUtil.cs
- StrokeDescriptor.cs
- IisTraceWebEventProvider.cs
- AssociationSetMetadata.cs
- BufferedGraphicsContext.cs
- SoapFormatter.cs
- DockAndAnchorLayout.cs
- DefaultProxySection.cs
- ConfigXmlAttribute.cs
- DataGridViewButtonCell.cs
- ThreadPool.cs
- EmulateRecognizeCompletedEventArgs.cs
- FileAuthorizationModule.cs
- _ProxyChain.cs
- HostedHttpRequestAsyncResult.cs
- RelationshipFixer.cs
- ArraySortHelper.cs
- Mappings.cs
- XmlReaderDelegator.cs
- KeyValuePair.cs
- SQLString.cs
- DbTransaction.cs
- PropertyDescriptor.cs
- XmlSchemaObjectCollection.cs
- ReverseQueryOperator.cs
- WpfKnownTypeInvoker.cs
- WsiProfilesElementCollection.cs
- MimeImporter.cs
- CircleHotSpot.cs
- CompareInfo.cs
- AdapterDictionary.cs
- WeakRefEnumerator.cs
- indexingfiltermarshaler.cs
- TargetControlTypeAttribute.cs
- DataServiceContext.cs
- UInt64Converter.cs
- ConcurrentStack.cs
- ParallelQuery.cs
- ListView.cs
- EdmError.cs
- RoleService.cs
- TrustManagerPromptUI.cs
- NativeMethods.cs
- Row.cs
- NavigationProperty.cs
- OperationFormatStyle.cs
- XmlChoiceIdentifierAttribute.cs
- Parameter.cs
- SingleResultAttribute.cs
- RegistrySecurity.cs
- RuleConditionDialog.cs
- XPathCompiler.cs
- RoutedEventConverter.cs
- PersonalizationState.cs
- ScriptingRoleServiceSection.cs
- LiteralControl.cs
- PasswordRecovery.cs
- XmlSortKeyAccumulator.cs