2013-11-26 10 views
6

ASP.NET/Mono MVC4 Web API v.1 Anwendung.Undefinierte API-Methodenaufrufe in ASP.NET MVC4-Web-API fangen

So fangen Sie Aufrufe von undefinierten API-Methoden ab. Aufruf http://localhost:52216/erp/api/undefinedmethod kehrt Fehler Browser:

<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> 

Wie für die Anmeldung zur Datenbank diesen Fehler fangen? Ich habe versucht, Code aus Frage

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

aber Application_Error und Ausnahmefiltercode ausgeführt wird immer noch nicht, Fehler zu Browser zurückgegeben. Wie wird dieser Fehler angezeigt?

Wenn url ist ohne api wie

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

Application_Error ordnungsgemäß ausgeführt.

WebAPI Konfiguration von VS2013 WebAPI Projektvorlage verwendet wird:

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

} 

aktualisieren

ich veränderte Antwort versucht. API-Controller verwenden die Forms-Autorisierung und sind mit dem Standardattribut [Authorize] versehen. Wenn die Autorisierung fehlschlägt, Standard xml api Fehlermeldung

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

auftritt. Wie bekomme ich diesen Fehler auch?

+0

Ich schätze, Sie erhalten ein HTTP 404 beim Aufruf dieser URL. Sie könnten eine benutzerdefinierte Fehlerseite für HTTP 404 erstellen und den Fehler in der Standardaktion des jeweiligen Controllers protokollieren. – Carsten

+0

API-Methoden und andere Controller können auch 404 Ergebnisseiten zurückgeben. Sie stellen json Inhalt auf diesen Seiten zur Verfügung, die 404 Fehler erklären, der an Anrufer genau in dieser Form übergeben wurde. Das sind geschäftliche Fehler, die nicht protokolliert werden sollten. Das Erstellen der globalen 404-Fehlerseite deaktiviert diese Methodenergebnisse. – Andrus

Antwort

4

Imran Baloch schrieb einen Artikel über genau, wie dies zu erreichen ist. Im Grunde müssen Sie Ihren eigenen HttpControllerSelector und HttpActionSelector erstellen. You can find the article here.

EDIT:

Wenn Ihre Anwendung auf andere Wege als die in der WebApiConfig registriert verwenden Sie müssen einige Änderungen an das Routing machen. Anstatt das am Ende der Register-Methode Error404 Route definieren, eine neue Methode (RegisterNotFound) definieren Sie die Route registrieren:

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" } 
     ); 
    } 
} 

Und dann in dem Global.asax diese Methode registrieren rufen zuletzt:

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

Ich habe versucht, es zu verwenden, aber jetzt gibt jede URL 404 Fehler zurück. Ich habe die Frage aktualisiert. – Andrus

+0

Ich habe die Antwort bearbeitet, um andere Routen zu ermöglichen. –

+0

Ich habe es versucht, aber wenn die Autorisierung fehlschlägt, wird der Fehler immer noch nicht abgefangen. Ich habe die Frage aktualisiert. – Andrus