异常过滤器属性不捕获异常(Web API 2)

时间:2017-08-26 00:42:34

标签: c# asp.net exception-handling

我是新手并开发了一个简单的API项目。我的SQL服务器脱机时,我试图在控制器中捕获异常。

可以看出我使用依赖注入。如果我不通过创建上下文来使用DI和访问数据库,我可以捕获异常。

所以基本上我被卡住了。

控制器:

public class PlayersController : ApiController
{
    IRepositoryBase<Player> players;

    public PlayersController(IRepositoryBase<Player> players)
    {
        this.players = players;
    }

    [ApiException]
    //GET: /api/players
    public IHttpActionResult Get()
    {            
        var playerList = players.GetAll();                
        return Ok(playerList);                         
    }

Api异常过滤器:

public class ApiException : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        HttpResponseMessage errorResponse = new HttpResponseMessage(HttpStatusCode.NotImplemented);
        errorResponse.ReasonPhrase = actionExecutedContext.Exception.Message;
        actionExecutedContext.Response = errorResponse;
        base.OnException(actionExecutedContext);
    }
}

1 个答案:

答案 0 :(得分:0)

我能够为我的问题提供解决方案。不知道这是否正确。

我重新设计了我的RepositoryBase构造函数,以便在关闭数据库连接时创建一个null的上下文。

<强> RepositoryBase:

public RepositoryBase(DataContext _context)
    {
       if (_context.Database.Connection.State == ConnectionState.Closed)
       {
            this._context = null;
            this._dbSet = null;
       }
       else
       {
            this._context = _context;
            this._dbSet = _context.Set<TEntity>();
       }

然后我更新了GetAll()方法,这样如果它看到一个空上下文就会抛出异常。

<强> GETALL():

    public virtual IQueryable<TEntity> GetAll()
    {
        if (_context==null)
        {
            throw new NotImplementedException("DB Not Found");
        }                 
        return _dbSet;
    } 

然后,ApiExceptionAttribute会捕获此异常,以确保客户端收到异常代码以及随之抛出的自定义消息。