为什么Response.End()没有结束请求

本文关键字:结束 请求 Response End 为什么 | 更新日期: 2023-09-27 18:25:32

我目前为我的MVC 4项目设置了一个全局错误处理程序。我们还将此错误处理程序用于一些web表单项目。在它将错误记录到数据库并向适当的人发送错误电子邮件后,它调用此方法,将我们的自定义错误页面发送给最终用户。

public static void WriteErrorResponse(string response)
{
    //Cleanup and send response to user
    HttpContext.Current.Server.ClearError();
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ContentType = "text/html";
    HttpContext.Current.Response.Write(response);
    HttpContext.Current.Response.End();
}

我遇到过一个例子,我们的标准错误消息不足以让我正确地跟踪我们的一个网站的问题。所以我想把函数定义封装在try-catch中,并在catch块中调用这个函数。这个catch语句看起来像这个

catch (System.Data.SqlClient.SqlException ex)
{
        string message = "<strong>Query Executed:</strong> <br>" + sql + "<br><br><br><strong>Query Variables:</strong><table><tbody>";
        foreach(var rv in rvs)
        {
            message += "<tr><th>" + rv.VariableName + "</th><td>" + variables[rv.VariableName] + "</td></tr>";
        }
        message += "</tbody></table>";
        Errors.Error.EmailError(message, ex);
        Errors.Error.LogError(message, ex);
        Errors.Error.Respond500();
        return null;
}

Errors.Error.Respond500()构建响应字符串,然后调用上面显示的WriteErrorResponse(string)方法。

所有这些实际上都有效,错误消息显示给用户,我得到了更详细的错误消息。问题是,请求继续执行,并且由于变量被设置为null,或者在标头已经发送后试图设置标头,等等,产生了第二个错误

所以现在我要问的是,为什么Response.End()没有像文档所说的那样结束请求。还有一个解决方案,它不需要我重新思考错误(在这种情况下发送了2封电子邮件,这很烦人!)

为什么Response.End()没有结束请求

catch块不调用Response.End()。一旦try{}中的某个东西抛出异常,该try}代码的其余部分将不会执行,因此永远不会到达End。

请尝试执行try{}-catch(ex){}-finally{},并在finally{}中调用Response.End(),无论是否捕获异常都会调用该函数。