【发布时间】:2013-05-10 01:42:41
【问题描述】:
我有这个System.AggregateException 类型的例外:
Message = "One or more errors occurred."
Source = null
StackTrace = null
它的InnerException是这个System.Reflection.TargetInvocationException:
Message = "Exception has been thrown by the target of an invocation."
Source = "mscorlib"
StackTrace =
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.Incoming(IHubIncomingInvokerContext context)
它的InnerException 是我创建的从ApplicationException 扩展的异常:
Message = "Some error writen by me at the hub"
Source = "Chat"
StackTrace =
at Chat.Hubs.ChatHub.SendMessage(String text, String clientConnId) in d:\...Chat\Chat\Hubs\ChatHub.cs:line 48
当我运行这个时:
Exception excpetion = ex.GetBaseException();
ex 是System.AggregateException 我在excpetion 得到System.Reflection.TargetInvocationException。 怎么会这样?
场景
我不知道如何在一个简单的项目中重现这一点。就我而言,我在 SignalR 项目中发现了这一点。一些集线器方法抛出异常并在 global.asax 处理错误:
GlobalHost.HubPipeline.AddModule(new MyHubPipelineModule());
而MyHubPipelineModule应该是这样的:
public class MyHubPipelineModule : HubPipelineModule
{
protected override void OnIncomingError(Exception ex, IHubIncomingInvokerContext context)
{
Exception excpetion = ex.GetBaseException();
context.Hub.Clients.Caller.ExceptionHandler(excpetion.Message);
}
}
注意:这应该使用 SignalR 1.0.1 完成。在 1.1.0 中异常更简单(更小的链)所以它运行良好。确保你有这个包版本:
<package id="Microsoft.AspNet.SignalR" version="1.0.1" targetFramework="net40" />
<package id="Microsoft.AspNet.SignalR.Core" version="1.0.1" targetFramework="net40" />
<package id="Microsoft.AspNet.SignalR.JS" version="1.0.1" targetFramework="net40" />
<package id="Microsoft.AspNet.SignalR.Owin" version="1.0.1" targetFramework="net40" />
<package id="Microsoft.AspNet.SignalR.SystemWeb" version="1.0.1" targetFramework="net40" />
【问题讨论】:
-
惊人的问题。因异常而异常。
-
一个异常类型应该是serializable 如果它跨越了执行上下文边界。不知道 SignalR 是否就是这种情况。