2017-11-02 6 views
0

ASP.NET ODataライブラリを使用して、ODataサービスが実装されています。ASP.NET ODataからの例外のキャッチ/変換メソッドの取得

だから、私はこのようなコントローラがあります。今

public class ProjectsController : ODataController 
{ 
    private readonly MyContext _db; 

    public ProjectsController(MyContext db) 
    { 
     _db = db; 
    } 

    [EnableQuery] 
    public IQueryable<Project> Get(string customQuery) 
    { 
     var query = _db.Projects; 

     if (!string.IsNullOrWhitespace(customQuery)) 
     { 
      query = query.Where(/* something complex going here */); 
     } 

     return query.OrderByDescending(p => p.Id); 
    } 

}

を、このすべてが正常に動作します。しかし、場合によっては、特定の「customQuery」によってSQLコードが生成され、0で除算されることがあります。そして、その結果、サーバはステータス500(oops)と次のようなエラーオブジェクトを返します:

{"error":{"code": ""、 "message": "エラーが発生しました」}}

これはあまり有益ではありません。私は例外をキャッチして、それを400という意味のあるメッセージで翻訳したい(カスタムクエリの修正方法をユーザーにアドバイスする)。

グローバル例外フィルタ、属性例外フィルタ.. no luckを設定しようとしました。何か案は?

答えて

0

誰もが進むべき道は自分IExceptionHandlerを実装することでした興味を持っている場合:

class MyExceptionHandler : IExceptionHandler 
{ 
    public virtual Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) 
    { 
     if (context.Request.Method == HttpMethod.Get && context.Request.RequestUri.AbsolutePath == "/odata/projects") 
     { 
      if (IsDivideByZero(context.Exception)) 
      { 
       const string message = "Division by zero encountered while applying the filter"; 
       var response = context.Request.CreateResponse(HttpStatusCode.BadRequest, new HttpError(message)); 
       context.Result = new ResponseMessageResult(response); 
      } 
     } 

     return Task.CompletedTask; 
    } 

    private static bool IsDivideByZero(Exception ex) 
    { 
     if (ex is SqlException sqlEx && sqlEx.Number == 8134) 
      return true; 

     return ex.InnerException != null && IsDivideByZero(ex.InnerException); 
    } 
} 

と、このようにDIに登録:

private static void Configure(HttpConfiguration config) 
{ 
    // ... 
    config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler()); 
    // ... 
} 
関連する問題