WebService和配置

时间:2009-02-09 10:07:47

标签: c# .net web-services configuration .net-2.0

我使用.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>();
...

2 个答案:

答案 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
   }
}