2 // System.Web.Configuration.WebConfigurationManager.cs
5 // Lluis Sanchez Gual (lluis@novell.com)
6 // Chris Toshok (toshok@ximian.com)
8 // Permission is hereby granted, free of charge, to any person obtaining
9 // a copy of this software and associated documentation files (the
10 // "Software"), to deal in the Software without restriction, including
11 // without limitation the rights to use, copy, modify, merge, publish,
12 // distribute, sublicense, and/or sell copies of the Software, and to
13 // permit persons to whom the Software is furnished to do so, subject to
14 // the following conditions:
16 // The above copyright notice and this permission notice shall be
17 // included in all copies or substantial portions of the Software.
19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
34 using System.Collections;
35 using System.Collections.Specialized;
36 using System.Reflection;
38 using System.Configuration;
39 using System.Configuration.Internal;
40 using _Configuration = System.Configuration.Configuration;
42 namespace System.Web.Configuration {
44 public static class WebConfigurationManager
47 static IInternalConfigConfigurationFactory configFactory;
48 static Hashtable configurations = new Hashtable ();
50 static internal IInternalConfigConfigurationFactory configFactory
53 IInternalConfigConfigurationFactory factory = (IInternalConfigConfigurationFactory)AppDomain.CurrentDomain.GetData("WebConfigurationManager.configFactory");
55 lock (AppDomain.CurrentDomain){
56 object initialized = AppDomain.CurrentDomain.GetData("WebConfigurationManager.configFactory.initialized");
57 if (initialized == null){
58 PropertyInfo prop = typeof(ConfigurationManager).GetProperty("ConfigurationFactory", BindingFlags.Static | BindingFlags.NonPublic);
60 factory = prop.GetValue(null, null) as IInternalConfigConfigurationFactory;
61 configFactory = factory;
66 return factory != null ? factory : configFactory;
69 AppDomain.CurrentDomain.SetData("WebConfigurationManager.configFactory", value);
70 AppDomain.CurrentDomain.SetData("WebConfigurationManager.configFactory.initialized", true);
74 static internal Hashtable configurations
77 Hashtable table = (Hashtable)AppDomain.CurrentDomain.GetData("WebConfigurationManager.configurations");
79 lock (AppDomain.CurrentDomain){
80 object initialized = AppDomain.CurrentDomain.GetData("WebConfigurationManager.configurations.initialized");
81 if (initialized == null){
82 table = new Hashtable();
83 configurations = table;
87 return table != null ? table : configurations;
91 AppDomain.CurrentDomain.SetData("WebConfigurationManager.configurations", value);
92 AppDomain.CurrentDomain.SetData("WebConfigurationManager.configurations.initialized", true);
97 static internal ArrayList extra_assemblies = null;
98 static internal ArrayList ExtraAssemblies {
100 if (extra_assemblies == null)
101 extra_assemblies = new ArrayList();
102 return extra_assemblies;
106 static WebConfigurationManager ()
108 PropertyInfo prop = typeof(ConfigurationManager).GetProperty ("ConfigurationFactory", BindingFlags.Static | BindingFlags.NonPublic);
110 configFactory = prop.GetValue (null, null) as IInternalConfigConfigurationFactory;
113 public static _Configuration OpenMachineConfiguration ()
115 return ConfigurationManager.OpenMachineConfiguration ();
118 [MonoTODO ("need to handle locationSubPath")]
119 public static _Configuration OpenMachineConfiguration (string locationSubPath)
121 return OpenMachineConfiguration ();
124 [MonoTODO("Mono does not support remote configuration")]
125 public static _Configuration OpenMachineConfiguration (string locationSubPath,
129 return OpenMachineConfiguration (locationSubPath);
131 throw new NotSupportedException ("Mono doesn't support remote configuration");
134 [MonoTODO("Mono does not support remote configuration")]
135 public static _Configuration OpenMachineConfiguration (string locationSubPath,
140 return OpenMachineConfiguration (locationSubPath);
141 throw new NotSupportedException ("Mono doesn't support remote configuration");
144 [MonoTODO("Mono does not support remote configuration")]
145 public static _Configuration OpenMachineConfiguration (string locationSubPath,
151 return OpenMachineConfiguration (locationSubPath);
152 throw new NotSupportedException ("Mono doesn't support remote configuration");
155 public static _Configuration OpenWebConfiguration (string path)
157 return OpenWebConfiguration (path, null, null, null, null, null);
160 public static _Configuration OpenWebConfiguration (string path, string site)
162 return OpenWebConfiguration (path, site, null, null, null, null);
165 public static _Configuration OpenWebConfiguration (string path, string site, string locationSubPath)
167 return OpenWebConfiguration (path, site, locationSubPath, null, null, null);
170 public static _Configuration OpenWebConfiguration (string path, string site, string locationSubPath, string server)
172 return OpenWebConfiguration (path, site, locationSubPath, server, null, null);
175 public static _Configuration OpenWebConfiguration (string path, string site, string locationSubPath, string server, IntPtr userToken)
177 return OpenWebConfiguration (path, site, locationSubPath, server, null, null);
180 public static _Configuration OpenWebConfiguration (string path, string site, string locationSubPath, string server, string userName, string password)
182 if (path == null || path.Length == 0)
187 conf = (_Configuration) configurations [path];
189 lock (configurations) {
190 conf = (_Configuration) configurations [path];
192 conf = ConfigurationFactory.Create (typeof (WebConfigurationHost), null, path, site, locationSubPath, server, userName, password);
193 configurations [path] = conf;
200 public static _Configuration OpenMappedWebConfiguration (WebConfigurationFileMap fileMap, string path)
202 return ConfigurationFactory.Create (typeof(WebConfigurationHost), fileMap, path);
205 public static _Configuration OpenMappedWebConfiguration (WebConfigurationFileMap fileMap, string path, string site)
207 return ConfigurationFactory.Create (typeof(WebConfigurationHost), fileMap, path, site);
210 public static _Configuration OpenMappedWebConfiguration (WebConfigurationFileMap fileMap, string path, string site, string locationSubPath)
212 return ConfigurationFactory.Create (typeof(WebConfigurationHost), fileMap, path, site, locationSubPath);
215 public static _Configuration OpenMappedMachineConfiguration (ConfigurationFileMap fileMap)
217 return ConfigurationFactory.Create (typeof(WebConfigurationHost), fileMap);
220 public static _Configuration OpenMappedMachineConfiguration (ConfigurationFileMap fileMap,
221 string locationSubPath)
223 return OpenMappedMachineConfiguration (fileMap);
226 internal static object SafeGetSection (string sectionName, Type configSectionType)
229 return GetSection (sectionName);
230 } catch (Exception) {
231 if (configSectionType != null)
232 return Activator.CreateInstance (configSectionType);
237 internal static object SafeGetSection (string sectionName, string path, Type configSectionType)
240 return GetSection (sectionName, path);
241 } catch (Exception) {
242 if (configSectionType != null)
243 return Activator.CreateInstance (configSectionType);
248 public static object GetSection (string sectionName)
250 string path = (HttpContext.Current != null
251 && HttpContext.Current.Request != null) ?
252 HttpContext.Current.Request.Path : HttpRuntime.AppDomainAppVirtualPath;
254 return GetSection (sectionName, path);
257 public static object GetSection (string sectionName, string path)
259 _Configuration c = OpenWebConfiguration (path);
260 ConfigurationSection section = c.GetSection (sectionName);
265 return get_runtime_object.Invoke (section, new object [0]);
268 readonly static MethodInfo get_runtime_object = typeof (ConfigurationSection).GetMethod ("GetRuntimeObject", BindingFlags.NonPublic | BindingFlags.Instance);
270 public static object GetWebApplicationSection (string sectionName)
272 string path = (HttpContext.Current == null
273 || HttpContext.Current.Request == null
274 || HttpContext.Current.Request.ApplicationPath == null
275 || HttpContext.Current.Request.ApplicationPath == "") ?
276 String.Empty : HttpContext.Current.Request.ApplicationPath;
278 return GetSection (sectionName, path);
281 public static NameValueCollection AppSettings {
282 get { return ConfigurationManager.AppSettings; }
285 public static ConnectionStringSettingsCollection ConnectionStrings {
286 get { return ConfigurationManager.ConnectionStrings; }
289 internal static IInternalConfigConfigurationFactory ConfigurationFactory {
290 get { return configFactory; }
293 #region stuff copied from WebConfigurationSettings
295 static internal IConfigurationSystem oldConfig {
297 return (IConfigurationSystem)AppDomain.CurrentDomain.GetData("WebConfigurationManager.oldConfig");
300 AppDomain.CurrentDomain.SetData("WebConfigurationManager.oldConfig", value);
304 static private Web20DefaultConfig config {
306 return (Web20DefaultConfig) AppDomain.CurrentDomain.GetData ("Web20DefaultConfig.config");
309 AppDomain.CurrentDomain.SetData ("Web20DefaultConfig.config", value);
313 static private IInternalConfigSystem configSystem {
315 return (IInternalConfigSystem) AppDomain.CurrentDomain.GetData ("IInternalConfigSystem.configSystem");
318 AppDomain.CurrentDomain.SetData ("IInternalConfigSystem.configSystem", value);
322 static internal IConfigurationSystem oldConfig;
323 static Web20DefaultConfig config;
324 //static IInternalConfigSystem configSystem;
326 const BindingFlags privStatic = BindingFlags.NonPublic | BindingFlags.Static;
327 static readonly object lockobj = new object ();
329 internal static void Init ()
335 /* deal with the ConfigurationSettings stuff */
337 Web20DefaultConfig settings = Web20DefaultConfig.GetInstance ();
338 Type t = typeof (ConfigurationSettings);
339 MethodInfo changeConfig = t.GetMethod ("ChangeConfigurationSystem",
342 if (changeConfig == null)
343 throw new ConfigurationException ("Cannot find method CCS");
345 object [] args = new object [] {settings};
346 oldConfig = (IConfigurationSystem)changeConfig.Invoke (null, args);
352 /* deal with the ConfigurationManager stuff */
354 HttpConfigurationSystem system = new HttpConfigurationSystem ();
355 Type t = typeof (ConfigurationManager);
356 MethodInfo changeConfig = t.GetMethod ("ChangeConfigurationSystem",
359 if (changeConfig == null)
360 throw new ConfigurationException ("Cannot find method CCS");
362 object [] args = new object [] {system};
363 changeConfig.Invoke (null, args);
364 //configSystem = system;
370 class Web20DefaultConfig : IConfigurationSystem
373 static private Web20DefaultConfig instance {
375 Web20DefaultConfig val = (Web20DefaultConfig)AppDomain.CurrentDomain.GetData("Web20DefaultConfig.instance");
377 val = new Web20DefaultConfig();
378 AppDomain.CurrentDomain.SetData("Web20DefaultConfig.instance", val);
383 AppDomain.CurrentDomain.SetData("Web20DefaultConfig.instance", value);
387 static Web20DefaultConfig instance;
390 static Web20DefaultConfig ()
392 instance = new Web20DefaultConfig ();
395 public static Web20DefaultConfig GetInstance ()
400 public object GetConfig (string sectionName)
402 object o = WebConfigurationManager.GetWebApplicationSection (sectionName);
404 if (o == null || o is IgnoreSection) {
405 /* this can happen when the section
406 * handler doesn't subclass from
407 * ConfigurationSection. let's be
408 * nice and try to load it using the
409 * 1.x style routines in case there's
410 * a 1.x section handler registered
413 object o1 = WebConfigurationManager.oldConfig.GetConfig (sectionName);
423 // nothing. We need a context.