Response.End()的替代方案是什么?

10

我处理一个名为begin_request的请求。目前我使用Response.End()来停止asp.net继续执行其他操作。但是,Response.End()会抛出异常,是否有一种非异常方式可以结束请求?

如果你想知道为什么我没有文件,那是因为我通过http响应头告诉nginx要提供哪个文件,因此在asp.net中没有其他事情可做。 Response.End会抛出异常,需要收集堆栈信息等等。显然我不需要这些东西,从我以前的问题中我知道,抛出异常是很昂贵的。那么我该怎么做呢?


@Oded不知道,但在MSDN上有记录,实际上也无关紧要。 - user34537
@Oded:这是一个“ThreadAbortException”。 - Cᴏʀʏ
可能是 https://dev59.com/B3NA5IYBdhLWcg3wHp-B?rq=1 的重复问题。 - Michael Freidgeim
2个回答

16

HttpResponse.End() 是一种有意设计抛出异常的方法;这是为了让它能够正常工作。

只有当 ThreadAbortException 异常抛出时,渲染响应的线程才会结束。如果没有异常抛出,则响应不会结束。

另一个替代方法是调用 HttpContext.Current.ApplicationInstance.CompleteRequest。这将通过直接跳转到 Application_EndRequest 事件来阻止进一步的代码执行。


那么我该如何避免出现异常呢?我在编辑之前看到了你的答案,但是在MSDN或自动完成中没有看到重载。http://msdn.microsoft.com/en-us/library/system.web.httpresponse.end%28v=VS.90%29.aspx - user34537
@acidzombie24:你说得对,这就是我编辑的原因。具有重载的方法是Response.Redirect(),它接受第二个布尔参数,表示它是否在内部调用Response.End() - Cᴏʀʏ

12
调用HttpContext.Current.ApplicationInstance.CompleteRequest()方法,而不是使用Response.End来绕过代码执行到Application_EndRequest事件。
参考链接:http://support.microsoft.com/kb/312629

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接