![](/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.