我是新手并开发了一个简单的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);
}
}
答案 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会捕获此异常,以确保客户端收到异常代码以及随之抛出的自定义消息。