2012-04-12 47 views

Respuesta

15

una opción sería configurar un ExceptionFilterAttribute personalizado, anular el método OnException y señalar a Elmah desde allí. Ver el enlace de abajo muestra

Elmah WebAPI Sample

+0

lo luché con (y todavía no he encontrado el momento de abordar) está teniendo la autenticación de formularios en mi acceso ELMAH mezclado con autenticación básica en mi api –

+1

@AntonyScott ¿Has mirado en [SEÑORA ] (http://www.raboof.com/projects/madam/)? –

8

Para API Web ASP.NET utilice el paquete Nuget Elmah.MVC, se dan detalles de los que a continuación

Tomado de: HOW TO SETUP ELMAH.MVC WITH ASP.NET MVC 4 ?

¿Cuál es Elmah ?

ELMAH es un proyecto de código abierto cuyo objetivo es registrar e informar excepciones no controladas en aplicaciones web ASP.NET.

¿Por qué usar Elmah?

ELMAH sirve como un discreto interceptor de excepciones de ASP.NET no controladas, las que normalmente se manifiestan con ASP.NET yellow screen of death.

Así que ahora sabemos qué y por qué usar Elmah, vamos a comenzar rápidamente a utilizar Elmah con su proyecto ASP.NET MVC.

Paso 1: Haga clic derecho sobre su solución y seleccione la opción "Administrar paquetes Nuget" enter image description here

Paso 2: En la búsqueda gerente Nuget paquete de "Elmah" e instalar la extensión Nuget Elmah.MVC. enter image description here El administrador de paquetes Nuget descargará y agregará los archivos DLL requeridos y modificará el archivo web <appSetting> para Elmah a wo enter image description here rk.

Paso 3: Eso es todo! Tu Elmah ahora está lista para probar. He generado un 404 para probar si mi Elmah funciona, se puede acceder a ELMAH por esta url: http://yourapp.com/elmah. enter image description here enter image description here

Espero que esto ayude :)

Lectura adicional:

+4

¿Y está generando ese 404 de un 'ApiController'? Si no es así, y es un controlador MVC estándar, te has perdido el objetivo de la pregunta por completo. –

+0

He generado 404 de un controlador normal, esto es solo un ejemplo, igual hubiera sido el caso si hubiera usado el controlador webapi y causara un 404. – Yasser

+12

¿Lo has probado realmente? Porque estoy bastante seguro de que ese no es el caso. El manejo de excepciones funciona de manera diferente en la API web. –

9

compruebe la URL a continuación se describen en detalle cómo utilizar ELMAH con API Web:

http://blogs.msdn.com/b/webdev/archive/2012/11/16/capturing-unhandled-exceptions-in-asp-net-web-api-s-with-elmah.aspx

También puede utilizar debajo del paquete NuGet:

Install-Package Elmah.Contrib.WebApi 

Uso:

Simplemente regístrela durante el inicio de la aplicación, o controlador por controlador.

protected void Application_Start() 
{ 
    GlobalConfiguration.Configuration.Filters.Add(new ElmahHandleErrorApiAttribute()); 

    ... 
} 

(de the Elmah.Contrib.WebApi GitHub repo)

18

Hay dos opciones mediante el uso de ELMAH para capturar excepciones en Web API.

Si desea capturar los errores que se encuentran en Acciones y controladores, es decir, en la lógica de su empresa puede crear un Atributo de filtro de acción y registrar esas excepciones en ELMAH.

ejemplo:

public class UnhandledExceptionFilter : ExceptionFilterAttribute { 
    public override void OnException(HttpActionExecutedContext context) { 
     Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(context.Exception)); 
    } 
} 

Entonces wireup mediante la adición de ese filtro.

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

     config.Filters.Add(new UnhandledExceptionFilter()); 
    } 
} 

Con el enfoque anterior siguiente errores no será manejada:

  • Excepciones lanzados desde constructores de controlador.
  • Excepciones lanzadas desde los controladores de mensajes.
  • Excepciones lanzadas durante el enrutamiento.
  • Excepciones lanzadas durante la serialización contenido de la respuesta

Referencia: http://blogs.msdn.com/b/webdev/archive/2012/11/16/capturing-unhandled-exceptions-in-asp-net-web-api-s-with-elmah.aspx & http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

Para que ELMAH que entrar errores Web API a nivel mundial tal que todos los errores 500 de servidor son capturados y luego hacer esto :

Instalar Nuget: https://www.nuget.org/packages/Elmah.Contrib.WebApi/

Añadir el siguiente a WebApiConfig

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     ... 
     config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger()); 
     ... 
    } 
} 

Y si desea mostrar los mensajes de error personalizados para los errores 500 Server se puede implementar la nueva ExceptionHandler en Web API (Tenga en cuenta que ExceptionLogger y ExceptionHandler son diferentes.)

class OopsExceptionHandler : ExceptionHandler 
{ 
    public override void HandleCore(ExceptionHandlerContext context) 
    { 
     context.Result = new TextPlainErrorResult 
     { 
      Request = context.ExceptionContext.Request, 
      Content = "Oops! Sorry! Something went wrong." + 
         "Please contact [email protected] so we can try to fix it." 
     }; 
    } 

    private class TextPlainErrorResult : IHttpActionResult 
    { 
     public HttpRequestMessage Request { get; set; } 

     public string Content { get; set; } 

     public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
     { 
      HttpResponseMessage response = 
          new HttpResponseMessage(HttpStatusCode.InternalServerError); 
      response.Content = new StringContent(Content); 
      response.RequestMessage = Request; 
      return Task.FromResult(response); 
     } 
    } 
} 

Referencia: http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

+0

gracias amigo, esto fue útil. Aún me estaba rascando la cabeza hasta que descubrí cómo hacerlo funcionar en mi situación (donde WebApi también se ejecuta en el contexto de un sitio de MVC); la respuesta fue simplemente instalar también el paquete Elmah.MVC. Lo amplío un poco en mi blog aquí: http://dbarrowstechblog.blogspot.co.uk/2015/03/elmah-aspnet-webapi-tip.html –

+0

La primera solución (simple) que llama directamente a 'Elmah.ErrorLog .GetDefault (HttpContext.Current) .Log' funciona bien, pero no envía un correo electrónico (si es así como configuraste Elmah) - simplemente inicia sesión. Si desea que su excepción sea manejada por Elmah de la manera que ha especificado en web.config, entonces le sugiero que reemplace la llamada de .Log con 'Elmah.ErrorSignal.FromCurrentContext(). Raise (context.Exception);' que desencadenar el manejo normal de Elmah. – Greg

Cuestiones relacionadas