c#WebAPI中的ExceptionHandler

时间:2016-05-18 09:35:01

标签: c# asp.net-web-api

我对这件事的确切运作方式有疑问。

public class GlobalExceptionHandler: ExceptionHandler
{
    private string _pvtMsg;

    public override void handle(ExceptionHandlerContext context)
    {
        //few if else conditions
        if()
        {
        }
        else if
        {
            _pvtMsg = "some value";
        }
        context.Result="Some random value depending upon if else execution";
    }
}

现在,在此之后设置_pvtMsg时,每当发生异常时,它始终具有与之前相同的值。

当我在_pvtMsg = "a";条件中设置else if时,下次发生错误时_pvtMsg仍有值"a"吗?

在我的应用程序的整个生命周期中是否只有一个handler实例可用,因此会发生这种情况?还是有其他原因吗?任何参考文件将不胜感激。

顺便说一句:此处理程序已使用Register的{​​{1}}方法注册。

WebApiConfig

1 个答案:

答案 0 :(得分:3)

你的假设是正确的。由于您注册GlobalExceptionHandler实例(使用new关键字)_pvrMsg将始终具有上一次(成功)调用的值。

如果_pvrMsg对您计划​​在if块中执行的操作至关重要,我建议您锁定此部分代码,以确保handle不执行多个一次一次。

最简单的方法是:

public class GlobalExceptionHandler: ExceptionHandler
{
    private string _pvtMsg;
    private readonly object _lock = new object();

    public override void handle(ExceptionHandlerContext context)
    {
        lock(_lock)
        {
            //few if else conditions
            if()
            {
            }
            else if
            {
                _pvtMsg = "some value";
            }
            context.Result="Some random value depending upon if else execution";
        }
    }
}