2013-11-26 59 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是不一樣的API

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

的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控制器正在使用Forms授權,並使用標準[授權] 屬性進行裝飾。 如果授權失敗,標準xml api錯誤信息

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

發生。如何捕捉這個錯誤呢?

+0

我想,你在調用這個URL的時候會收到一個HTTP 404。您可以爲HTTP 404創建自定義錯誤頁面,並將錯誤記錄在相應控制器的默認操作中。 – Carsten

+0

api方法和其他控制器也可以返回404個結果頁面。他們在這個頁面中提供了json內容,這些內容正是以這種形式正確地傳遞給調用者的404錯誤。那些是不應該記錄的商業錯誤。創建全局404錯誤頁面會禁用這些方法結果。 – Andrus

回答

4

伊姆蘭俾路支寫了一篇文章,究竟如何實現這一目標。基本上你需要創建你自己的HttpControllerSelector和HttpActionSelector。 You can find the article here

編輯:

如果應用程序使用比在WebApiConfig註冊,您將需要進行一些修改路由等航線。相反,在註冊方法的末端界定的Error404路線,定義一個新的方法(RegisterNotFound)註冊的路線:

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()); 

} 
+0

我試圖使用它,但現在每個網址都會返回404錯誤。我更新了問題。 – Andrus

+0

我已經編輯了允許其他路線的答案。 –

+0

我試過了,但如果授權失敗,錯誤仍然沒有被捕獲。我更新了問題。 – Andrus

相關問題