如何在web.config中存储自定义数据
本文关键字:存储 自定义 数据 config web | 更新日期: 2023-09-27 18:28:28
我的apiController中有以下方法:
public IEnumerable<something> GetData(DataProvider dataProvider)
{
return dataProvider.GetData();
}
我需要的是从javascript调用这个方法,并向它传递DataProvider派生类型的参数。我可以通过传递字符串来处理这个问题,例如"FirstProvider",然后在GetData()方法中写入N个if来创建一个正确类型的实例。
但是有没有什么方法可以让我在web.config文件中写一些类似的东西:
<DataProviders>
<type = FirstDataProvider, alias = "FirstProvider">
<type = SecondDataProvider, alias = "SecondProvider">
</DataProviders>
将getData方法更改为:
public IEnumerable<something> GetData(string dataProviderAlias)
{
// get provider type by it's alias from web congfig,
// then instantiated and call:
return dataProvider.GetData();
}
然后通过它的别名找到并实例化类型?
注意:我接受了下面的答案,因为它为我指明了正确的方向,但msdn说IConfigurationSectionHandler
不推荐使用
因此,我使用ConfigurationSection
、ConfigurationElementCollection
、ConfigurationElement
类来构建自定义配置部分。
您可以将任意数据存储在web.config的appSettings
元素中:
<configuration>
<appSettings>
<add key="FirstAlias" value="FirstProvider" />
<add key="SecondAlias" value="SecondProvider" />
</appSettings>
</configuration>
然后您可以使用读取值
String firstAlias = System.Configuration.ConfigurationManager.AppSettings["FirstAlias"];
String secondAlias = System.Configuration.ConfigurationManager.AppSettings["SecondAlias"];
它是内置的。它得到了支持。这是应该存储自定义数据的地方。
首先,您只能将有效的xml存储在web.config中。<type = FirstDataProvider, alias = "FirstProvider">
不是有效的xml。
第二,有很多移动部件。请仔细遵循步骤-
web.config
确保为DataProvider输入了正确的命名空间type="YOUR_APPLICATION.DataProviders".
<configuration>
<configSections>
<section name="DataProviders" type="WebApplication2010.DataProviders"
requirePermission="false"/>
</configSections>
<DataProviders>
<Provider type="FirstDataProvider" alias="FirstProvider"/>
<Provider type="SecondDataProvider" alias="SecondProvider"/>
</DataProviders>
....
</configuration>
代码
public class DataProviders : IConfigurationSectionHandler
{
private static bool _initialized;
public static List<Provider> _providers;
public object Create(object parent, object configContext, XmlNode section)
{
XmlNodeList providers = section.SelectNodes("Provider");
_providers = new List<Provider>();
foreach (XmlNode provider in providers)
{
_providers.Add(new Provider
{
Type = provider.Attributes["type"].Value,
Alias = provider.Attributes["alias"].Value,
});
}
return null;
}
public static void Init()
{
if (!_initialized)
{
ConfigurationManager.GetSection("DataProviders");
_initialized = true;
}
}
public static IEnumerable<Provider> GetData(string dataProviderAlias)
{
return _providers.Where(p => p.Alias == dataProviderAlias);
}
}
public class Provider
{
public string Type { get; set; }
public string Alias { get; set; }
}
Global.asax
为了获得良好的设计实践,您希望只从web.config读取一次数据,并将其存储在静态变量中。因此,您需要在Global.asax.的Application_BeginRequest内部进行初始化
public class Global : System.Web.HttpApplication
{
void Application_BeginRequest(object sender, EventArgs e)
{
DataProviders.Init();
}
}
用法
var providers = DataProviders.GetData("FirstProvider").ToList();
嗯,我不确定我是否理解您想要实现的目标,但要实现您的想法,您需要一个自定义的节处理程序。
http://msdn.microsoft.com/en-us/library/2tw134k3(v=vs.100).aspx
如果您想为特定的数据提供商创建数据库连接,请参阅以下类似的问题:
ASP.NET:如何从web.config ConnectionString创建连接?
在我的例子中,我需要在Web.Config文件中存储两个字节[]的变量。由于它必须是有效的XML数据,所以我简单地存储了数组的内容,如下所示:
<appSettings>
<add key="Array1" value="0,1,2,3,4,5,6,7,8,9" />
<add key="Array2" value="0,1,2,3,4,5,6,7,8,9" />
</appSettings>
然后,我调用一个函数,将其读取为C#字符串,将其拆分为字符串[],并将每个字符串元素作为字节解析为结果字节[]并返回