![](/img/trans.png)
[英]Serious problem with WCF, GridViews, Callbacks and ExecuteReaders exceptions
[英]Prevent Exceptions From WCF Callbacks
我正在制作一個小型聊天應用程序。 我到達了一個客戶端發送消息的地步,然后通過使用會議室中其他客戶端的回調,他們迅速接收到該消息。 因此,如果會議室中有10個人,則正在發送消息的客戶端的服務實例將在10個線程中調用此實例:
targetCallback.RecieveMessage(message);
現在,Internet連接是易變的,很可能會在執行之前中斷一會兒,因此會引發異常並自動銷毀客戶端實例,從而使消息未發送或未成功。
我發現示例根本無法真正處理這些異常,而其他示例則簡單了:
try
{
targetCallback.RecieveMessage(message);
}
catch
{
}
但是,這是處理此異常的最佳方法嗎?
看到
http://msdn.microsoft.com/en-us/library/aa354510.aspx
尋求好的建議。 簡要地說,您應該捕獲TimeoutException和CommunicationException。
在調用WCF回調時,我也看到過ObjectDisposedExceptions,也許還有某種SecurityException,但是我不記得是哪一個。
對於需要更高可靠性的應用程序,我編寫了一個基本的包裝方法,該方法可以捕獲所有異常並從您的回調集合中刪除該回調。 然后,我只會通過包裝調用回調。
通常,我還會從OperationContext中捕獲有關連接的一些上下文信息,例如IP地址,sessionID和用戶令牌,以便我可以識別出失敗者並進行記錄。 但這留給讀者練習。
public interface ICallbackContract
{
void Operation(string arg);
}
class Program
{
private List<ICallbackContract> Callbacks;
private void SendMessage(string msg)
{
lock (this.Callbacks)
{
foreach (var callback in this.Callbacks)
{
this.InvokeWcf(callback, (c) => c.Operation(msg));
}
}
}
public void InvokeWcf(this ICallbackContract contract, Action<ICallbackContract> op)
{
if (((ICommunicationObject)contract).State != CommunicationState.Opened)
{
lock (this.Callbacks)
Callbacks.Remove(contract);
myLogger.LogError("That contract isn't open! Disconnected.");
return;
}
try
{
op(contract);
}
catch (TimeoutException ex)
{
lock (this.Callbacks)
Callbacks.Remove(contract);
myLogger.LogError("That contract timed out! Disconnected.", ex);
return;
}
catch (CommunicationException ex)
{
...
}
catch (ObjectDisposedException ex)
{
...
}
catch (Exception ex)
}
// Unexpected case.
lock (this.Callbacks)
Callbacks.Remove(contract);
myLogger.FatalError("Something really bad happened!.", ex);
throw;
{
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.