2013-11-26 11 views
6

ASP.NET/Mono MVC4 Web API v.1アプリケーション。ASP.NET MVC4 Web APIで未定義のapiメソッド呼び出しをキャッチする方法

未定義のAPIメソッドへの呼び出しを捕捉する方法。 は、ブラウザにhttp://localhost:52216/erp/api/undefinedmethod戻りエラーを呼び出す:

<Error> 
<Message> 
No HTTP resource was found that matches the request URI 'http:// localhost:52216/erp/api/undefinedmethod'. 
</Message> 
<MessageDetail> 
No type was found that matches the controller named 'undefinedmethod'. 
</MessageDetail> 
</Error> 

データベースにログインするために、このエラーをキャッチする方法は? 私は質問

How do I log ALL exceptions globally for a C# MVC4 WebAPI app?

からのコードを試してみましたが、のApplication_Errorと例外フィルタコードがまだ実行されず、エラーが ブラウザに返されます。 このエラーをキャッチする方法はありますか?

URLが

'http://localhost:52216/erp/undefinedmethod' 

のようなAPIなしの場合のApplication_Errorが適切に実行されます。

VS2013 WebAPIのプロジェクトテンプレートからの設定が使用されているWebAPIの:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

} 

更新

私が変更された答えを試してみました。 APIコントローラはフォームの承認を使用しており、標準[Authorize] 属性で装飾されています。 認証が失敗した場合、標準のXML APIエラーメッセージ

<Error> 
<Message>Authorization has been denied for this request.</Message> 
</Error> 

が発生します。どのようにこのエラーをキャッチする?

+0

このURLを呼び出すと、HTTP 404が届いたと思います。 HTTP 404のカスタムエラーページを作成し、それぞれのコントローラーのデフォルトアクションにエラーを記録することができます。 – Carsten

+0

apiのメソッドと他のコントローラも404の結果ページを返すことができます。彼らは、このページで、shuldがこの形式で発信者に正確に渡した404エラーを説明するjsonコンテンツを提供します。それらはログに記録すべきではないビジネスエラーです。グローバル404エラーページを作成すると、それらのメソッドの結果が無効になります。 – Andrus

答えて

4

Imran Balochは、これを達成する方法についての記事を書きました。基本的には、独自のHttpControllerSelectorとHttpActionSelectorを作成する必要があります。 You can find the article here

EDIT:

アプリケーションがWebApiConfigに登録したもの以外の経路を使用している場合は、ルーティングにいくつかの変更を加える必要があります。

public static class WebApiConfig 
{  
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 

    public static void RegisterNotFound(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "Error404", 
      routeTemplate: "{*url}", 
      defaults: new { controller = "Error", action = "Handle404" } 
     ); 
    } 
} 

をそしてGlobal.asaxの中で最後にこのメソッドを呼び出す登録:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    WebApiConfig.Register(GlobalConfiguration.Configuration); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
    WebApiConfig.RegisterNotFound(GlobalConfiguration.Configuration); 


    GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector), 
     new HttpNotFoundAwareDefaultHttpControllerSelector(GlobalConfiguration.Configuration)); 
    GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpActionSelector), 
     new HttpNotFoundAwareControllerActionSelector()); 

} 
代わりにRegisterメソッドの最後にError404ルートを定義し、ルートを登録する新しい方法(RegisterNotFound)を定義します
+0

私はそれを使用しようとしましたが、すべてのURLは404エラーを返します。私は質問を更新しました。 – Andrus

+0

他のルートを許可する答えを編集しました。 –

+0

私はそれを試しましたが、認証が失敗した場合でも、エラーはまだキャッチされません。私は質問を更新しました。 – Andrus

関連する問題