在Page_Load()部分,我检查有效输入和&如果它们无效,我会将请求转移到自定义错误页面。
在执行此操作时,抛出了一个ThreadAbortException,它被我的catch块捕获,但asp.net将请求转移到未知异常页面。 我究竟做错了什么?当我转移到错误页面时,我不希望ThreadAbortException出现。 例如:
protected void Page_Load(object sender, EventArgs e)
{
try
{
if (String.IsNullOrEmpty(szProductName))
{
//Product name not given. Hence cant process further.
Server.Transfer(Constants.ERROR_WRONG_INPUTS_ASPX);
}
else
{
//Do something.....
}
}
catch(Exception Ex)
{
}
}
作为解决方法,我现在使用:
Response.Redirect(Constants.ERROR_WRONG_INPUTS_ASPX, false);
而不是Server.Transfer,即我允许进程在后台继续,这使得我需要检查有效性&然后只执行剩余的代码。
我的问题类似于:Exception Handling Application Block Exception Handler running in ASP.NET cannot call Response.End(),但似乎没有回答。
答案 0 :(得分:1)
Response.Redirect抛出ThreadAbortException以中止当前页面并将控制转移到新页面。添加false参数“修复”此问题,因为它告诉Response.Redirect在转移控件之前完成当前页面上的处理。
我相信你需要查看你的申请流程。由于输入错误而将页面传输到错误页面似乎是一种过于复杂的方式来处理输入验证。我认为你最好使用一个显示消息的回发,或者在发布页面之前在javascript中进行一些验证。
答案 1 :(得分:0)
每次调用Response.End()时,都会发生ThreadAbortException。 Server.Transfer在内部调用Response.End(),因为它立即结束当前处理并将请求移交给新页面,新页面负责将信息返回给浏览器。
Response.Redirect更加优雅,因为它完成了对当前请求的处理并向客户端返回301重定向响应。通常,这会导致浏览器向服务器发出第二个请求重定向URL的请求。
你说它正在转移到一个未知的错误页面,但我不确定为什么。你是在Global.asax的Application_Error方法中这样做的吗?如果处理了错误,您应该能够控制它前进的位置。
答案 2 :(得分:0)
我觉得你摆脱了那个尝试......抓住了。你有什么期望赶上那里?如果您真的期望某些特殊情况取决于您的实现,那么这将在您的 else 块中进一步发生。所以你应该用try ...终于把它包起来。
ASP.NET在结束您的请求时抛出ThreadAbortException,但它最终会在调用堆栈中捕获它,因此您不应该自己捕获它。如果你期望其他一些可能的状态损坏,那就让它传播到全局异常处理程序;这不是你的代码抛出。
答案 3 :(得分:0)
如果产品缺失或产品不在您的数据存储中,那么您可能需要考虑返回404(找不到页面)。这表明浏览器 - (以及谷歌搜索蜘蛛!) - 没有这样的页面。您是否计划使用SEO友好的URL,例如: http://MyServer/MySite/Products/FireFox?