【问题标题】:How to handle thrown error inside Global.asax file in Asp.Net MVC如何在 Asp.Net MVC 的 Global.asax 文件中处理抛出的错误
【发布时间】:2012-11-29 08:17:36
【问题描述】:

我已经搜索并尝试了很多文章,但仍然无法解决这个问题。 我在 Global.asax 文件中有这段代码:

LogInClient("username", "password");

由于 Windows Azure 中发生了更新,我的所有服务 (REST) 都无法找到(但这是另一回事)。 Web 显示错误请求错误。我想要发生的是,对于任何类型的错误,网站都会重定向到错误页面。

但我总是被重定向到这个

http://127.0.0.1:81/Error?aspxerrorpath=/
https://127.0.0.1/Error?aspxerrorpath=/

我正在通过 Cloud 项目运行我的 Asp.Net MVC 项目。

这是我到目前为止所做的:

Web.Config

<customErrors mode="On" defaultRedirect="Error"/>

Global.asax 文件

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
}  

我迷路了。请帮忙。

【问题讨论】:

    标签: c# asp.net-mvc error-handling


    【解决方案1】:

    你可以在你的 global.asax 中有这个:

        void Application_Error( object sender, EventArgs e )
        {
            Boolean errorRedirect = false;
            Boolean redirect404 = false;
            try
            {
                var exception = Server.GetLastError();
                var httpException = exception as HttpException;
                Response.Clear();
                Server.ClearError();
                var routeData = new RouteData();
                routeData.Values[ "controller" ] = "Errors";
                routeData.Values[ "action" ] = "General";
                routeData.Values[ "exception" ] = exception;
                Response.StatusCode = 500;
                if ( httpException != null )
                {
                    Response.StatusCode = httpException.GetHttpCode();
                    switch ( Response.StatusCode )
                    {
                        case 403:
                            redirect404 = true;
                            break;
                        case 404:
                            redirect404 = true;
                            break;
                        default:
    errorRedirect = true;
                            //todo: log errors in your log file here
                            break;
                    }
                }
    
            }
            catch ( Exception ex )
            {
                errorRedirect = true;
            }
    
            if ( redirect404 )
            {
                //redirect to 404 page
                Response.Redirect( "~/404.htm" );
            }
            else if ( errorRedirect )
            {
                //redirect to error page
                Response.Redirect( "~/error.htm" );
            }
        }
    

    还有一些错误不能被 global.asax 捕获,因此您还需要通过将以下内容放入所有 aspx 代码隐藏中或最好放在扩展 System.Web.UI.Page 的单个类中来捕获 aspx 错误,然后让您的所有代码隐藏从该类继承。放在那里的代码如下:

        protected override void OnError( EventArgs e )
        {
            try
            {
                //todo: log errors in your log files
            }
            catch ( Exception ex ) { }
            //redirect to error page
            Response.Redirect( "~/error.htm" );
        }
    

    【讨论】:

    • 其实我已经尝试过你的第一个代码块,它会抛出一个错误,因为Response 还不能访问,因为在application_start 中抛出了错误。但我会尝试你的第二个代码块。我会在测试完后立即更新您。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 2012-08-26
    • 2012-09-17
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多