2011-03-15 77 views
2

我希望能夠通過將參數放入service.svc文件中,將特定於應用程序的配置信息傳遞給我的WCF。將參數添加到WCF .svc文件

我有一個標準的錯誤日誌記錄Web服務,我從不同的應用程序調用。我希望能夠用不同的名稱調用服務,並讓服務知道它是如何調用的,並寫入不同的文件。例如,應用程序將調用Warning.svc,Serious.svc或Critical.svc,並根據所謂的將消息寫入適當的文件。

所以我的想法是在.svc文件中添加一個參數,告訴WCF它是如何被調用的。如果沒有,是否有辦法從我的代碼中獲取svc文件的名稱?

我知道每次調用都可以有不同的方法,但是當我想添加一個額外的類型時,需要修改WCF。而我可以添加另一個.svc,而不必修改任何代碼即可添加功能。

回答

1

我不認爲你可以在.svc文件中做到這一點。

但是,這似乎是一個相當複雜的方式去做你想做的事情,而且根本不是典型的Web服務風格。對於基本上相同的Web服務,您不應該有太多端點,只有很小的差異。這將是未來保持的噩夢。

爲什麼你不能修改你的方法來接受多一個參數,這是一個字符串或枚舉,或者任何表明你想要登錄哪個文件?如果傳遞null,則寫入默認值。這是通常在通用日誌記錄包中完成的方式。

3

您可以在svc文件<%@ ServiceHost %>標記中指定一個自定義的ServiceHostFactory,然後使用服務屬性獲取所需的任何內容。這個值將被傳遞給你的SHFactory,在那裏你可以解析它並用它初始化你的ServiceHost。

這裏的,只是反映了默認的WCF行爲的一個例子:

Service1.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfService2.Service1" Factory="WcfService2.CustomServiceHostFactory" CodeBehind="Service1.svc.cs" %> 

CustomServiceHostFactory.cs:

namespace WcfService2 
{ 
    using System; 
    using System.ServiceModel; 
    using System.ServiceModel.Activation; 

    public class CustomServiceHostFactory : ServiceHostFactoryBase 
    { 
     public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses) 
     { 
      var host = new ServiceHost(Type.GetType(constructorString), baseAddresses); 
      host.AddDefaultEndpoints(); 
      return host; 
     } 
    } 
} 
+0

有趣。每天學些新東西! – 2011-03-17 05:30:54

+0

我對這種方法一無所知,從MSDN文檔中可以清楚知道爲什麼不行 - 這太可怕了!你有沒有在網上了解到這個地方?有鏈接? – 2011-03-18 21:37:54

+0

反射器+試驗和錯誤,但我現在看到,smaine有一個很好的寫作:http://hyperthink.net/blog/servicehostfactory-vs-servicehostfactorybase/ – alexdej 2011-03-18 22:43:26