2012-09-26 18 views
8

Ho codice che sta prendendo piede in tutte le eccezioni Global.asaxGestione delle eccezioni in 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(); 
     } 

Come posso ottenere il nome del controller in cui questo errore è accaduto

Come posso ottenere richiesta IP del cliente?

E posso filtrare le eccezioni? Non ho bisogno di 404, 504 .... erori

grazie

+0

'Non ho bisogno di 404, 504 .... erors' ehh? Ecco come funziona HTTP. E cosa intendi con 'posso filtrare le eccezioni'? – jgauffin

+0

Questo post ti aiuterà sicuramente http://prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc – VJAI

risposta

6

Global.asax non ha la nozione di controller e azioni, quindi credo che non ci sia un'API per il recupero dei nomi di controller e azioni. Tuttavia si potrebbe dare una prova per la risoluzione richiesta 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; 

Per ottenere l'IP dell'utente è possibile utilizzare UserHostAddress proprietà:

string userIP = HttpContext.Current.Request.UserHostAddress; 

Per filtrare HTTP eccezioni che non si ha intenzione di gestire è possibile usa qualcosa come:

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

Un'ultima osservazione sulla gestione delle eccezioni - non è una pratica migliore per farlo a livello globale quando v'è un modo per eseguire più loc alleato. Per esempio in ASP.NET MVC di base Controller classe ha un metodo:

protected virtual void OnException(ExceptionContext filterContext) 

che, se ignorato, vi darà il controllo completo sul verificata un'eccezione. Puoi avere tutte le informazioni disponibili per te in Global.asax plus ASP.NET MVC caratteristiche specifiche come riferimento a controller, contesto vista, dati percorso ecc.

+0

Andrei grazie per aver riprodotto il tuo codice funziona perfettamente. Puoi fornire qualche buon tutorial sulla classe del controller di base? –

+0

@Acid, certo. Per esempi di base consulta questo [post di blog] (http://www.entwicklungsgedanken.de/2009/07/16/redirect-from-the-onexception-method-inside-the-controller-with-asp-net-mvc /) e questo [articolo] (http://www.devproconnections.com/article/aspnetmvc/aspnet-exception-141263). – Andrei

+0

È possibile saltare l'utilizzo di UrlHelper (e saltare il riferimento MVC) con ... 'RouteData routeData = System.Web.Routing.RouteTable.Routes.GetRouteData (currentContext);' –

3

ho usato come questo è al di sotto

si può ottenere IP dell'utente come questo

var userip = context.Request.UserAgent; 

e si può ottenere il vostro URL dove questo errore è accaduto come questo

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

penso che questo vi aiuterà a ...

0

Prenderei una virata diversa e metterei usa un attributo sui tuoi controller (o controller di base se ne hai 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 

     } 
}