2011-06-06 34 views
1

我有一个WCF服务,有时托管在IIS中,有时托管在Windows服务中。这对于我的应用程序的不同部署选项是必需的。在服务对象中确定托管位置的好方法是什么?如何确定WCF服务是否托管在IIS或其他内部?

我想这样做的原因是,当我的服务托管在IIS中时,它以常规方式从web.config文件获取连接字符串信息。当它由Windows服务托管时,它以不同的方式(从注册表中的信息)获取配置信息。在我的服务对象的构造函数中,我要记下从哪里获取连接字符串信息,例如这样的事情:

public void MyServiceObject() 
{ 
    _hostedInIis = isHostedInIis(); 
} 
private string ConnectionString() 
{ 
    if (_hostedInIis) 
     return ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString; 
    else 
     return GetConnectionStringFromRegistry(); 
} 

另外,有没有办法,我可以传递一些配置信息,当我托管它的Windows服务?例如传递它的连接字符串或一个标志,说它是在Windows服务中托管的。

+1

对于这些部署中的每一个,您将拥有不同的端点吗? – Aravind 2011-06-06 12:16:06

+3

侧面的问题:是否有一个原因,你不想保持你的服务部署的app.config配置设置? – jlafay 2011-06-06 12:26:18

+0

@Aravind,你的意思是不同的终点uri?由于windows服务使用特定的端口,它们几乎肯定会有所不同,但IIS可能使用相同的URI,并且在开发过程中我们经常会这样做。 – Rory 2011-06-06 12:46:10

回答

1

我选择我的子类服务类,在我的Windows服务托管时使用的子类。子类唯一的区别是它知道从注册表中获取配置信息,而不是默认位置:配置管理器。这比我最初想要的更好,因为服务不需要知道它在哪里。

-1

probabily是不是最好的方式,但你可以检查HttpContext的是在Asp.net应用

private string ConnectionString() 
     { 
      if (HttpContext.Current!=null) 
       return ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString; 
      else 
       return GetConnectionStringFromRegistry(); 
     } 
+0

仅当您在ASP.NET兼容模式下运行服务时。 – shambulator 2011-06-06 19:10:56

2

我需要类似的东西时,我成立了一个服务与配置运行或者独立的正常存在,或在IIS下没有配置文件。我最终为IIS案例使用了一个自定义的ServiceHostFactory。在工厂构建ServiceHost之后,它将自定义配置对象添加到其Extensions属性中,并将无法放入web.config的信息添加到该属性中。事情是这样的:

protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
{ 
    var host = base.CreateServiceHost(serviceType, baseAddresses); 
    host.Extensions.Add(new CustomConfigurer()); 
    return host; 
} 

然后在服务.svc文件,你可以指定定制工厂,IIS将只使用它:

<%@ ServiceHost Service="..." Factory="..." %> 

当你的服务操作被调用时,可以看一下配置对象上的主机的扩展:

public int Add(int x, int y) 
{ 
    var config = OperationContext.Current.Host.Extensions.Find<CustomConfigurer>(); 
    if (config == null) 
    { 
    // Load elsewhere 
    } 
}