在调用点在Unity截获方法完全堆栈跟踪(Full stack trace for intercep

2019-09-20 15:09发布

我们正在研究使用Unity来处理与拦截日志服务的方法。 然而,值得关注的是完整的堆栈跟踪不可用在调用点; 它只是一个拦截器调用中使用。

下面是一个例子设置:

public interface IExceptionService
{
    void ThrowEx();
}

public class ExceptionService : IExceptionService
{
    public void ThrowEx()
    {
        throw new NotImplementedException();
    }
}

public class DummyInterceptor : IInterceptionBehavior
{
    public IEnumerable<Type> GetRequiredInterfaces()
    {
        return Type.EmptyTypes;
    }

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
    {
        IMethodReturn ret = getNext()(input, getNext);
        if (ret.Exception != null)
            Console.WriteLine("Interceptor: " + ret.Exception.StackTrace + "\r\n");
        return ret;
    }

    public bool WillExecute
    {
        get { return true; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer container = new UnityContainer();
        container.AddNewExtension<Interception>();

        container.RegisterType<IExceptionService, ExceptionService>(
            new Interceptor<InterfaceInterceptor>(),
            new InterceptionBehavior<DummyInterceptor>());

        try
        {
            container.Resolve<IExceptionService>().ThrowEx();
        }
        catch (Exception e)
        {
            Console.WriteLine("Call Site: " + e.StackTrace);
        }

    }
}

下面是运行程序控制台输出:

Interceptor:
at ConsoleDemo.ExceptionService.ThrowEx() in    C:\code\ServiceDemo\ConsoleDemo\Program.cs:line 25
at DynamicModule.ns.Wrapped_IExceptionService_248fe3264f81461f96d34670a0a7d45d.<ThrowEx_DelegateImplementation>__0(IMethodInvocation inputs, GetNextInterceptionBehaviorDelegate getNext)

Call Site:
at DynamicModule.ns.Wrapped_IExceptionService_248fe3264f81461f96d34670a0a7d45d.ThrowEx()
at ConsoleDemo.Program.Main(String[] args) in C:\code\ServiceDemo\ConsoleDemo\Program.cs:line 63

在拦截器堆栈跟踪是好的,将足以满足服务级别的日志记录。 然而,我们失去了一切都会过去在调用点的拦截代理呼叫;

我可以包装在拦截异常的ServiceException或一些这样的,而且将保持调用堆栈中的内部异常,但导致尴尬的日志和调试检查的情况(但不是完全失去了踪迹少尴尬)。

我也注意到我们得到更多或更少我们想要的东西,当我们使用TransparentProxyInterceptor,但指出为大于InterfaceInterception慢,触发警钟对某些群体。

有没有清洁的方式在代理上调用网站获得使用Unity截取完整的堆栈跟踪?

Answer 1:

在.NET 4.5会有ExceptionDispatchInfo用于这一目的。

对于所有其他版本,你可以看到这个问题:
在C#中,我怎么能再次抛出的InnerException不失堆栈跟踪?



文章来源: Full stack trace for intercepted methods at call site in Unity