2012-09-26 25 views
8

que tienen código que se está imponiendo en todas las excepciones Global.asaxManejo de excepciones en global.asax ASP.NET MVC

protected void Application_Error(object sender, EventArgs e) 
     { 
      System.Web.HttpContext context = HttpContext.Current; 
      System.Exception exc = context.Server.GetLastError(); 
      var ip = context.Request.ServerVariables["REMOTE_ADDR"]; 
      var url = context.Request.Url.ToString(); 
      var msg = exc.Message.ToString(); 
      var stack = exc.StackTrace.ToString(); 
     } 

¿Cómo puedo obtener el nombre de controlador donde ocurrió este error

¿Cómo puedo conseguir solicitar IP del cliente?

¿Puedo filtrar las excepciones? No necesito 404, 504 .... erors

gracias

+0

'No necesito 404, 504 .... erors' ehh? Así es como funciona HTTP. ¿Y qué quiere decir con 'puedo filtrar excepciones'? – jgauffin

+0

Esta publicación definitivamente te ayudará http://prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc – VJAI

Respuesta

6

Global.asax no tiene noción de controladores y acciones, por lo que creo que no hay una API para recuperar nombres de controlador y acción. Sin embargo es posible darle una oportunidad para la resolución de solicitud de URL:

HttpContextBase currentContext = new HttpContextWrapper(HttpContext.Current); 
UrlHelper urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); 
RouteData routeData = urlHelper.RouteCollection.GetRouteData(currentContext); 
string action = routeData.Values["action"] as string; 
string controller = routeData.Values["controller"] as string; 

Para obtener el IP del usuario puede utilizar UserHostAddress propiedad:

string userIP = HttpContext.Current.Request.UserHostAddress; 

Para filtrar HTTP excepciones que no se va a manejar que pueda usar algo como:

HttpException httpException = exception as HttpException; 
if (httpException != null) 
{ 
    switch (httpException.GetHttpCode()) 
    { 
     case 404: 
     case 504: 
      return; 
    } 
} 

una última observación sobre el manejo de excepciones - no es una buena práctica para hacerlo a nivel global cuando hay una manera de realizar más loc aliado. Por ejemplo, en ASP.NET MVC clase base Controller tiene un método:

protected virtual void OnException(ExceptionContext filterContext) 

que, cuando se anula, le dará un control total sobre la excepción ocurrido. Puede tener toda la información disponible para usted en Global.asax más ASP.NET MVC características específicas como una referencia al controlador, contexto de vista, datos de ruta, etc.

+0

Gracias Andrei por reproducir tu código funciona perfectamente. ¿Puedes proporcionar algún buen tutorial sobre la clase de controlador base? –

+0

@Acid, seguro. Para obtener ejemplos básicos, consulte esta [publicación de blog] (http://www.entwicklungsgedanken.de/2009/07/16/redirect-from-the-onexception-method-inside-the-controller-with-asp-net-mvc /) y este [artículo] (http://www.devproconnections.com/article/aspnetmvc/aspnet-exception-141263). – Andrei

+0

Puede omitir el uso de UrlHelper (y omitir la referencia de MVC) con ... 'RouteData routeData = System.Web.Routing.RouteTable.Routes.GetRouteData (currentContext);' –

3

que utilicé como esto está por debajo de

puede obtener IP del usuario como esto

var userip = context.Request.UserAgent; 

y se puede obtener su URL donde ocurrió este error como este

var ururl = System.Web.HttpContext.Current.Request.Url; 

creo que esto le ayudará a ...

0

Tomaría un rumbo diferente y pondría use un atributo en sus controladores (o controlador base si tiene uno)

public class HandleErrorAttributeCustom : HandleErrorAttribute 
    { 
     public override void OnException(ExceptionContext context) 
     { 
      //you can get controller by using 
      context.Controller.GetType() 

      //however, I'd recommend pluggin in Elmah here instead 
      //as it gives this easily and also can has filtering 
      //options that you want 

     } 
} 
Cuestiones relacionadas