【发布时间】:2012-06-30 23:40:56
【问题描述】:
当满足一组条件时,我希望能够将简单的字符串输出为文本而不是 HTML 页面。我目前正在使用:
Protected Sub OutputString(ByVal Str As String)
Dim bytes() As Byte
bytes = System.Text.Encoding.UTF8.GetBytes(Str)
Response.ContentType = "text/plain"
Response.OutputStream.Write(bytes, 0, bytes.Length)
Response.End()
End Sub
这很好用,完全符合我的要求,但是,Response.End() 会产生异常,并且(我相信)应该尽可能避免。
我想我可以为这段代码使用一个单独的“空”页面,但它更多的是一种解决方法而不是一种解决方案。另外,有人说了一些关于超越 HTML 输出行为的事情(现在不记得在哪里了)。
如果有人能告诉我最好的方法,我将非常感激。
更新: 我找到了这个链接: Response.Redirect(url) ThreadAbortException Solution
它建议使用 HttpContext.Current.ApplicationInstance.CompleteRequest() 并覆盖渲染页面的函数:
Dim DoNotOutputHTML As Boolean = False
Protected Overrides Sub RaisePostBackEvent(sourceControl As IPostBackEventHandler, eventArgument As String)
If DoNotOutputHTML = False Then
MyBase.RaisePostBackEvent(sourceControl, eventArgument)
End If
End Sub
Protected Overrides Sub Render(writer As HtmlTextWriter)
If DoNotOutputHTML = False Then
MyBase.Render(writer)
End If
End Sub
然后您可以通过设置变量 DoNotOutputHTML 来选择是否输出您的 html 页面。
我遇到的唯一问题是 CompleteRequest() 之后的任何代码仍然执行。我可以通过重组我的代码来解决这个问题,尽管如果我不需要它会更整洁(更少的 if/else 块),就像我不需要 response.end()
有什么建议吗?
【问题讨论】:
-
这不是您问题的答案,但我认为您可以使用
Response.Write而不是直接写入字节。 -
Response.End()有哪些例外情况? -
@minitech 非常正确。我有多笨?哈哈。不知道为什么我没有想到。
-
@Tim Schmelter 我相信这个异常有据可查(也会影响 server.transfer 和 response.redirect,因为它们使用 response.end)。我得到的确切错误是:mscorlib.dll 中发生了“System.Threading.ThreadAbortException”类型的第一次机会异常 mscorlib.dll 中发生了“System.Threading.ThreadAbortException”类型的异常,但未在用户代码中处理跨度>