asp.net Application_Error()未触发

sbtkgmzw  于 2023-08-08  发布在  .NET
关注(0)|答案(4)|浏览(183)

我正在尝试运行一个将异常记录到数据库的ASP.NET应用程序。我正在使用Application_Error来捕获异常。
在添加连接字符串之前,只是为了测试我的代码(Logger类和Global.asax中的代码),我试图将错误记录到windows事件查看器中。这与预期的一样。
但是在将连接字符串添加到Web.config文件并添加ADO.NET代码之后,我尝试运行该应用程序。但我得到了死亡的黄色屏幕:D
我不知道我的代码有什么问题。我只修改了Web.config文件中的connectionStrings元素,并添加了ADO.NET代码。
这里是代码。
这是Page_Load事件中的Web表单程式码。Countries.xml文件不存在,预计会引发错误。

DataSet dataset = new DataSet();
dataset.ReadXml(Server.MapPath("~/Countries.xml"));
GridView1.DataSource = dataset;
GridView1.DataBind();

字符串
应用程序错误(_E)

Exception exception = Server.GetLastError();
if (exception != null)
{
Logger.Log(exception);
Server.ClearError();
Server.Transfer("~/Errors.aspx");
}


Web.config

<configuration>
<connectionStrings>
    <add name="DBCS" connectionString="Data Source=.;database=Sample;Integrated Security=SSPI" providerName="System.Data.SqlClient" />
  </connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
</system.web>
</configuration>


我尝试通过在Global.asax中的Application_Error方法处放置一个断点来进行调试,但控件从未到达该点。该异常由Page_Load事件触发。Logger类别程式码中没有编译错误。另外,我不想使用customErrors路由来解决这个问题。
先谢了。
以下是代码的链接:https://drive.google.com/folderview?id=0B5K22Q9r50wXU0VOQmJKVHBoaDg&usp=sharing

alen0pnh

alen0pnh1#

如果你在***调试***时有<customErrors mode="Off" />,代码不会到达Application_Error事件,因为浏览器内会立即显示异常。
如果要在调试时到达Application_Error,则需要启用自定义错误-

<customErrors mode="On" defaultRedirect="~/Error.aspx" />

字符串

nnvyjq4y

nnvyjq4y2#

你在web.config上启用了自定义错误吗?

<system.web>
    ...
    <customErrors mode="RemoteOnly" defaultRedirect="~/Errors.aspx" redirectMode="ResponseRewrite" />
    ...
</system.web>

字符串
请注意,重定向模式为“ResponseRewrite”,以保留Server.GetLastError()异常。如果您设置此值,则Server.GetLastError()将返回null。
实现Application_Error应该很容易。在Global.asax

protected void Application_Error(Object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    if (ex is ThreadAbortException)
        return; // Redirects may cause this exception..
    Logger.Error(LoggerType.Global, ex, "Exception");
    Response.Redirect("unexpectederror.htm");
}


最新消息:
可能的罪魁祸首是在Global.asax上注册为筛选器的HandlerErrorAttribute。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute()); // this line is the culprit
}


只需注解掉或删除该行,并确保您已经在web.config下的system.web中实现了customErrors。
我对HandleErrorAttribute不是很熟悉,如果它解决了您的问题,那么不妨查看一下它的文档。

cgvd09ve

cgvd09ve3#

在我的例子中,我在这个事件处理程序中有错误日志记录(sentry.io),日志记录算法本身导致错误,因此重定向到web.config中定义的错误页面,我也认为它没有触发。确保在错误处理程序中对代码也使用try-catch,以便调试用例。即,将异常细节作为响应刷新并结束响应。
以下是我的错误记录器sentry.io:

public static void LogException(Exception ex, bool redirect = true)
{
    if (ex != null)
    {
        if (HttpContext.Current.Request.IsLocal)
        {
            throw ex;
        }

        // ignore Response.Redirect errors
        if (ex.GetType() == typeof(ThreadAbortException))
        {
            return;
        }

        var sentryApiKey = GetAppSetting("SentryIO.ApiKey");

        if (string.IsNullOrEmpty(sentryApiKey))
        {
            throw new NullReferenceException("SentryIO.ApiKey not defined as app setting.");
        }

        var ravenClient = new RavenClient(sentryApiKey);
        ravenClient.Capture(new SentryEvent(ex));

        if (redirect)
        {
            HttpContext.Current.Response.StatusCode = 404;
            HttpContext.Current.Response.Redirect("/?500-error-logged");
        }
    }
}

字符串
正如我所看到的,在发布模式下构建或具有如下所示的web.config,并不能阻止此事件的触发。

<compilation debug="false" targetFramework="4.5.2" />
<customErrors mode="RemoteOnly" defaultRedirect="errordocs/500.htm">
    <error statusCode="403" redirect="errordocs/403.htm" />
    <error statusCode="404" redirect="errordocs/404.htm" />
</customErrors>

jfewjypa

jfewjypa4#

对我来说,问题是endResponse被设置为false
我从false改为true,解决了这个问题:

HttpContext.Current.Response.Redirect($"/e/{errorId}", true);

字符串

相关问题