2017-11-28 34 views
1

MVCまたはWeb APIレイヤーに例外を捕捉し、例外を生成したURIを取得し、コンフィグレーションからユーザにメッセージをルックアップするインターセプタを1セット持っていたいと思います。ユニセプト例外の傍受 - コンフィグレーション

たとえば、POST/api/v1/vehicleの同じ例外が「VIN is already」と応答している間に、一意の制約違反をスローする/ api/v1/userへのPOSTは "User already exists"システム内 "となる。

これにはUnityの機能がありますか?そうでない場合は、公に利用可能なソースからの例がありますか?

答えて

1

Unityは、ASP.NETアプリケーションのエラー応答をカスタマイズするためのツールではありません。これはDependency Injectionコンテナであり、必要なすべての依存関係を持つコントローラをインスタンス化するだけです。それをアプリケーションロジックと混在させるのは悪い考えです(エラーレスポンスのカスタマイズも確かにその一部です)。

ASP.NET MVCとASP.NET Web APIは、必要なもの、つまり例外フィルタに適した拡張ポイントを提供します。以下は、ASP.NET Web APIのサンプルです。

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext context) 
    { 
     // Add your exception handling here 

     // Check context.Exception and decide whether you need to handle it 
     if (context.Exception is SqlException) 
     { 
      var controllerType = context.ActionContext.ControllerContext.Controller.GetType(); 

      if (controllerType == typeof(UserController)) 
      { 
       context.Response = new HttpResponseMessage(HttpStatusCode.Conflict) 
       { 
        Content = new StringContent("User already exists") 
       }; 
      } 
      else 
      { 
       // Cover other controller types here 
      } 
     } 
    } 
} 

ご覧のとおり、実装はかなり簡単です。 OnException()メソッドの中には、コントローラとアクションのコンテキストを持つ例外自体にアクセスすることができます。 ロジックでこのコントローラのアクションに対してこの例外を処理する必要がある場合は、適切なHttpResponseMessagecontext.Responseと入力し、HTTPステータスコードと本文を選択します。

あなたのWebApiConfig.Register(HttpConfiguration config)またはコントローラレベルの中

GlobalConfiguration.Configuration.Filters.Add(new CustomExceptionFilterAttribute()); 

でグローバルな例外フィルタを適用することができます。

[CustomExceptionFilter] 
public class UserController : ApiController 

実装は、ASP.NET MVCのために非常に似ています。その場合、フィルタにSystem.Web.Mvc.IExceptionFilterを実装する必要があります。

関連する問題