我正在開發一個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
完成此操作,爲什麼我不能以編程方式完成此任務?
如果都這樣做以編程方式,你爲什麼碰到else(sdb!= null)? ServiceDebugBehavior不應該被創建? – felickz
@felickz我發現ServiceDebugBehavior是由ServiceHost自動創建的。 – sbrown
嗯,刪除它,並添加你的總是? – felickz