2011-06-06 66 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 
    } 
}