【问题标题】:Handling exceptions in global.asax ASP.NET MVC处理 global.asax ASP.NET MVC 中的异常
【发布时间】:2012-09-17 17:28:52
【问题描述】:

我的代码可以捕获 Global.asax 中的所有异常

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

如何获取发生此错误的控制器名称

如何获取请求客户端 IP?

我可以过滤异常吗?我不需要 404、504.... 错误

谢谢

【问题讨论】:

标签: asp.net asp.net-mvc exception global-asax


【解决方案1】:

Global.asax 没有控制器和动作的概念,所以我相信没有用于检索控制器和动作名称的 API。但是,您可以尝试解析请求 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;

要获取用户 IP,您可以使用 UserHostAddress 属性:

string userIP = HttpContext.Current.Request.UserHostAddress;

要过滤掉你不打算处理的 HTTP 异常,你可以使用类似的东西:

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

关于异常处理的最后一点评论 - 当有一种方法可以在本地执行时,在全局级别执行它不是最佳实践。例如在 ASP.NET MVC 基础 Controller 类中有一个方法:

protected virtual void OnException(ExceptionContext filterContext)

当被覆盖时,您可以完全控制发生的异常。您可以在 Global.asax plus ASP.NET MVC 特定功能中获得所有可用信息,例如对控制器的引用、视图上下文、路由数据等。

【讨论】:

  • Andrei 感谢您重播您的代码完美运行。你能提供一些关于基本控制器类的好教程吗?
  • @Acid,当然。有关基本示例,请查看 blog postarticle
  • 您可以跳过使用 UrlHelper 的用法(并跳过 MVC 参考)...'RouteData routeData = System.Web.Routing.RouteTable.Routes.GetRouteData(currentContext);'
【解决方案2】:

我是这样用的,它在下面

你可以像这样获取用户ip

var userip = context.Request.UserAgent; 

您可以像这样获取发生此错误的网址

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

我认为这会对你有所帮助...

【讨论】:

    【解决方案3】:

    我会采取不同的策略,并在您的控制器(或基本控制器,如果有的话)上使用属性

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

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 1970-01-01
      • 2011-03-18
      • 2012-05-20
      • 2012-02-02
      • 2019-02-05
      • 2012-05-04
      • 1970-01-01
      • 2011-06-16
      相关资源
      最近更新 更多