2014-01-29 75 views
1

我正在開發一個Windows服務來承載各種項目的WCF服務。使用下面的app.config片段:如何以編程方式向端點添加ServiceDebug行爲?

<system.serviceModel> 
    <services> 
     <service name="MyWcfService" behaviorConfiguration="MetaDataBehavior"> 
      <endpoint contract="MyWcfService" binding="wsHttpBinding" address="" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MetaDataBehavior"> 
       <serviceMetadata httpGetEnabled="true"/> 
       <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </bindings> 
</system.serviceModel> 

我可以公開股票服務「幫助」頁面,並在同一個URL一個WSHttpBinding從我的服務範圍內,像這樣:

ServiceHost myServiceHost = new ServiceHost(typeof(MyWcfService), new Uri(serviceAddress)); 
myServiceHost.Open() 

然後我就可以打開一個網頁瀏覽器並轉到,例如http://host:8001/services/MyWcfService,我看到標準的WCF幫助頁面,所以我知道該服務正在工作。 (目前,讓我們忽略暴露幫助頁面的安全影響。)我也可以在同一個URL上訪問WSHttpBinding端點

現在我們已經發展到在此服務中託管很多WCF服務,所以我正在努力通過以編程方式將端點添加到ServiceHost對象來簡化配置。這一切都運作良好,使用myServiceHost.AddServiceEndpoint()

我還沒有能夠以編程方式獲得的最後一部分是在與WSHttpBinding相同的URL上啓用ServiceDebug行爲。我有以下幾點:

ServiceDebugBehavior sdb = myServiceHost.Description.Behaviors.Find<ServiceDebugBehavior>(); 
if (sdb == null) 
{ 
    sdb = new ServiceDebugBehavior() 
    { 
     HttpHelpPageEnabled = true, 
     IncludeExceptionDetailInFaults = true 
    }; 
    myServiceHost.Description.Behaviors.Add(sdb); 
} 
else 
{ 
    sdb.HttpHelpPageEnabled = true; 
    sdb.IncludeExceptionDetailInFaults = true; 
    //sdb.HttpHelpPageUrl = new Uri(serviceAddress +"/help"); 
} 
ServiceEndpoint endpoint = new ServiceEndpoint(contract, new WSHttpBinding, new EndpointAddress(new Uri(serviceAddress))); 
myServiceHost.AddServiceEndpoint(endpoint); 

其工作,只要我一)更改幫助頁面的地址(如上註釋),或b)更改URI在其上WSHttpBinding監聽。從概念上講,這是有道理的:.NET不希望有兩個端點在相同的URI上偵聽。

我的問題是我必須保持與使用此服務的現有應用程序的兼容性,這意味着我的端點地址無法更改。如果我可以通過app.config完成此操作,爲什麼我不能以編程方式完成此任務?

+0

如果都這樣做以編程方式,你爲什麼碰到else(sdb!= null)? ServiceDebugBehavior不應該被創建? – felickz

+0

@felickz我發現ServiceDebugBehavior是由ServiceHost自動創建的。 – sbrown

+0

嗯,刪除它,並添加你的總是? – felickz

回答

1

你不能真正添加​​ServiceDebugBehavior到ServiceHost的,你所要做的就是修改現有ServiceDebugBehavior(也有同樣的問題)

svcHost = new ServiceHost(typeof(MyService), adrbase); 
      // Configure Your Service 
      // Now for the ServiceDebugBehavior you want to modify (Example disable HTTP Help Page) 
      svcHost.Description.Behaviors.Find<ServiceDebugBehavior>().HttpHelpPageEnabled = false; 
相關問題