簡體   English   中英

編寫通用的WCF服務客戶端配置/端點檢查器?

[英]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發現支持運行時和設計時發現。 將發現添加到您的應用程序可用於啟用其他方案,例如容錯和自動配置。

首次嘗試時,您可以查詢端點以查看其是否支持預期的合同。

最大的好處是您可以讓客戶端“發現”它想在運行時與之對話的服務。 這消除了您可能經常看到的許多客戶端配置錯誤。

您需要簽出SO-AWARE 它是一個Web服務管理工具,可以管理整個組織中基於SOAP或REST WCF的服務。 此外,它還有一個測試工作台!

這也是一些展示它的視頻:

從角度來看,這是如此復雜,以至於這些人靠謀生為生,我不認為這是您要自己現實地構建的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM