[英]Writing a generic WCF service client config/endpoint checker?
我有一個使用許多服務的客戶端應用程序。 當服務關閉或配置錯誤時,這並不總是立即可見。 我擁有服務端代碼並托管大多數服務,但不是全部。 這確實是客戶端代理的混合包-不同的綁定(basichttp / wshttp / nettcp),一些是使用svcutil.exe生成的,而另一些則是通過ChannelFactory以編程方式制作的,而合同則位於同一程序集中。 但是,我始終可以訪問地址,約束力和合同。
我希望在客戶端應用程序中有一個組件,該組件可以對綁定/端點配置和服務可用性進行基本檢查(以在客戶端的某些診斷面板中顯示)。 至少,我只想知道在配置的地址處有一個端點,甚至更好的是找出該端點是否響應並支持客戶端嘗試使用的綁定。
我嘗試使用Google搜索,但感到驚訝的是我沒有找到一個示例(也許已經是一個不好的兆頭),但我發現這並不是那么困難,我要做的就是創建一個clientchannel並嘗試open()和close()捕獲發生的任何異常,並在必要時放棄()。
我錯了-特別是對於使用BasicHttpBinding的客戶端,我可以在其中指定任何端點地址,並且能夠在沒有任何異常的情況下打開和關閉。
這是我的實現的精簡版,實際上,我返回的是有關異常類型和端點地址的更詳細的信息,但這是基本結構。
public class GenericClientStatusChecker<TChannel> : ICanCheckServiceStatus where TChannel : class
{
public GenericClientStatusChecker(Binding binding, EndpointAddress endpoint)
{
_endpoint = endpoint;
_binding = binding;
}
public bool CheckServiceStatus()
{
bool isOk = false;
ChannelFactory<TChannel> clientChannelFactory = null;
IClientChannel clientChannel = null;
try
{
clientChannelFactory = new ChannelFactory<TChannel>(_binding, _endpoint);
}
catch
{
return isOk;
}
try
{
clientChannel = clientChannelFactory.CreateChannel() as IClientChannel;
clientChannel.Open();
clientChannel.Close();
isOk = true;
}
catch
{
if (clientChannel != null)
clientChannel.Abort();
}
return isOk;
}
}
[Test]
public void CheckServiceAtNonexistentEndpoint_ExpectFalse()
{
var checker = new GenericClientStatusChecker<IDateTimeService>(new BasicHttpBinding(), new Endpointaddress("http://nonexistenturl"));
// This assert fails, because according to my implementation, everything's ok
Assert.IsFalse(checker.CheckServiceStatus());
}
我還嘗試了一個類似的技術,使用一個虛擬的testclient類,該類實現了具有相同結果的ClientBase。 我想知道所有服務合同都實現了通用的CheckHealth()方法是可能的,但是由於某些服務不在我的控制范圍內,所以我什至無法做到這一點。
因此,是否有可能編寫像這樣的簡單通用通用服務檢查器? 如果是這樣怎么辦? (如果沒有,為什么不呢?)
謝謝!
您是否看過WCF發現 ?
WCF發現允許客戶端根據不同的條件(包括合同類型,綁定元素,名稱空間,范圍以及關鍵字或版本號)搜索服務。 WCF發現支持運行時和設計時發現。 將發現添加到您的應用程序可用於啟用其他方案,例如容錯和自動配置。
首次嘗試時,您可以查詢端點以查看其是否支持預期的合同。
最大的好處是您可以讓客戶端“發現”它想在運行時與之對話的服務。 這消除了您可能經常看到的許多客戶端配置錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.