[英]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.