我使用.NET 2.0框架创建了一个WebService,这是一个基于接口的类,该接口具有WebServiceAttribute并使用IIS和ASMX文件托管它。 WebService当前从一个XML文件加载其配置。
我想创建这个服务的多个实例,每个实例加载它自己的配置。
通过复制ASMX文件,我可以使用不同的名称创建Web服务的克隆,该名称将基于完全相同的实现。但是它也会加载完全相同的配置文件,这使得它变得毫无用处。
所以我的问题是:创建基于一个类的任意数量的Web服务的最佳方法是什么,它们位于一个IIS虚拟目录中,每个目录都加载不同的配置文件? < / p>
在Pavel Chuchuva的回答的帮助下,我创建了以下代码来处理配置的加载:
public class WebConfigManager
{
public static T Load<T>() where T: new()
{
string location =
HttpContext.Current.Request.PhysicalPath + ".config";
if (HttpContext.Current.Cache[location] is T)
{
return (T)HttpContext.Current.Cache[location];
}
using (Stream s =
new FileStream(location, FileMode.Open, FileAccess.Read))
{
return (T)(HttpContext.Current.Cache[location] =
new XmlSerializer(typeof(T)).Deserialize(s));
}
}
}
// example of the usage of WebConfigManager
public class MyWebService : IMyWebService
{
Config config = WebConfigManager.Load<Config>();
...
答案 0 :(得分:1)
我建议将asmx放在不同的文件夹中,并在每个文件夹中放置web.config,并设置该特定Web服务实例。这是简单快捷的方式
OR
您可以使用Web Service Enhancements 3.0并创建WSE路由器,将对ASMX的调用重定向到该路由器,然后让路由器将调用转发到正确的Web服务实例并传递其他配置。这是一种更复杂的方式,但它使您能够使用Web服务的单个实例,该实例根据路由器传递的参数选择正确的配置。 有关WSE3.0的更多信息,请指向MSDN。
希望这有帮助!
答案 1 :(得分:1)
复制并粘贴.asmx文件以创建Web服务的多个实例(例如Service1.asmx,Service2.asmx等)。
根据Context.Request.FilePath值加载配置文件:
public string LoadConfig()
{
string configPath = Server.MapPath(this.Context.Request.FilePath + ".xml");
using (XmlReader reader = XmlReader.Create(configPath))
{
// Will read Service1.asmx.xml, Service2.asmx.xml and so on
}
}