如何确定WCF服务是否托管在IIS中或其他位置
本文关键字:IIS 其他 位置 WCF 何确定 服务 是否 | 更新日期: 2023-09-27 17:58:32
我有一个WCF服务,它有时托管在IIS中,有时托管在Windows服务中。这对于我的应用程序的不同部署选项是必要的。在服务对象中,有什么好方法可以确定它的托管位置?
我想要这样做的原因是,当我的服务托管在IIS中时,它会以正常方式从web.config文件中获取连接字符串信息。当它由windows服务托管时,它会以不同的方式(从注册表中的信息)获取配置信息。在我的服务对象的构造函数中,我想注意从哪里获取连接字符串信息,例如:
public void MyServiceObject()
{
_hostedInIis = isHostedInIis();
}
private string ConnectionString()
{
if (_hostedInIis)
return ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
else
return GetConnectionStringFromRegistry();
}
或者,当我在windows服务中托管它时,有没有一种方法可以将一些配置信息传递给它?例如,将连接字符串或表示其托管在windows服务内的标志传递给它。
当我设置一个服务以使用配置独立运行时,或者在根本没有配置文件的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
}
}
我选择了服务类的子类,并在Windows服务中托管时使用了该子类。子类中唯一的区别是它知道从注册表而不是默认位置获取配置信息:配置管理器。这比我最初想要的要好一些,因为服务不需要知道它在哪里
可能不是最好的方法,但您可以检查HttpContext,它通常存在于Asp.net应用程序中
private string ConnectionString()
{
if (HttpContext.Current!=null)
return ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
else
return GetConnectionStringFromRegistry();
}