8

我有捕获 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.... 错误

谢谢

4

3 回答 3

6

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以及ASP.NET MVC 特定功能中获得所有可用的信息,例如对控制器的引用、视图上下文、路由数据等。

于 2012-09-26T07:15:41.843 回答
3

我这样用它在下面

你可以像这样获取用户ip

var userip = context.Request.UserAgent; 

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

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

我想这会帮助你...

于 2012-09-26T06:51:05.120 回答
0

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

 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

        }
}
于 2012-09-26T07:42:25.157 回答