簡體   English   中英

C#-在基於事件的WCF代理中處理故障異常

[英]C# - Handling Fault Exceptions in event-based WCF proxy

我正在使用Visual Studio生成的基於事件的代理來使用WCF服務。 我遇到了一個問題,如果對服務的調用超時,我的應用程序將掛起。 對該服務的調用如下:

ServiceClient client = new ServiceClient(binding, endpointAddress);
client.AuthenticateCompleted += (sender, e) =>
{
    if (e.Error != null)
        throw e.Error;
};
client.AuthenticateAsync(username, password);

瀏覽無數其他問題時,普遍的共識是,任何異常都應由WCF捕獲並在上述e.Error找到。 但是,當我的服務超時時,情況並非如此,錯誤要么為null,要么在我運行的其他一些測試中,應用程序在到達代碼中的這一點之前崩潰了。 另一個用戶建議將以上代碼包裝在try / catch塊中,但是,這樣做也無法捕獲異常。

我還嘗試過將try / catch塊以及其他許多更復雜的方法放到完成處理程序中,這超出了問題的范圍,因為我真的只需要以最簡單的形式進行此工作即可。

值得一提的是,盡管許多故障發生在實時服務上,並且每次打開,關閉,發送和接收超時都為30秒,但我也一直在嘗試通過將超時降低到<1秒。 我認為這仍然會生成超時異常,並且不會引起任何其他問題,但是我不確定100%。

我也沒有創建WCF服務,因此,如果需要在服務器端執行一些特定的操作以將異常返回給客戶端,則可能缺少此元素。 如果是這樣,有什么辦法可以解決?

事實證明, IService.EndMethodName方法引發了錯誤,該方法無法通過Visual Studio生成的類進行訪問。

相反,我決定直接訪問該頻道,以便對事情有更多的控制。 最終的實現如下所示(IService是Visual Studio生成的接口):

ChannelFactory<IService> factory = new ChannelFactory<IService>(binding, endpointAddress);

// CreateChannel may not require any parameters outside of Mono
IService channel = factory.CreateChannel(endpointAddress);

channel.BeginAuthenticate(new AuthenticateRequest(arg0, arg1), result =>
{
    try
    {
        channel.EndAuthenticate(result);
    }
    catch(Exception ex)
    {
        throw;
    }
}, channel);

這是最簡單的形式,但是通常的想法是,調用在try / catch塊內的AsyncCallback結束,以在那里進行任何異常處理。

暫無
暫無

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

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