如何确定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服务内的标志传递给它。

如何确定WCF服务是否托管在IIS中或其他位置

当我设置一个服务以使用配置独立运行时,或者在根本没有配置文件的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();
        }