ASP.Net Response.Close问题

时间:2010-07-10 15:07:15

标签: c# asp.net .net visual-studio-2008 iis-7

我正在使用ASP.Net + .Net 3.5 + VSTS 2008 + IIS 7.0 + C#来开发Web应用程序。我发现在VSTS 2008中进行调试时,如果我在page_load中调用Response.Close()方法(请参考下面的代码),则会出现错误(从IE访问页面时),无法连接到服务器。

我的问题是,

  1. 通常我们什么时候应该调用Response.Close()?或者不需要调用(依靠ASP.Net框架自动关闭)?
  2. BTW:我之前的理解是开发人员在服务器端完成处理并且所有数据都已使用Response.Write写入客户端时应始终调用Response.Close。我是对的吗?

    2为什么我在代码中遇到了这样的错误?根本原因是什么?

        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write("Hello World! ");
            Response.Close();
        }
    

5 个答案:

答案 0 :(得分:10)

MSDN website中的以下内容在此处可能有用:

  

此方法以突然方式终止与客户端的连接,并非用于正常的HTTP请求处理。该方法向客户端发送重置数据包,这可能导致在服务器,客户端或其间某处缓冲的响应数据被丢弃。

     

您可以使用此方法来响应恶意HTTP客户端的攻击。但是,如果您想跳到EndRequest事件并向客户端发送响应,通常应该调用CompleteRequest。

答案 1 :(得分:6)

通常不应在“正常”ASP.NET处理中使用Response.Close方法。

写入HttpResponse“流”的所有数据在发送到客户端浏览器之前都会被缓冲。 Response.Close方法将突然终止HTTP连接,并且您可能会丢失之前无意中响应的数据。

如果您确实希望以编程方式“强制”响应流的结尾,则应使用:Response.Flush();后跟Response.End();

Response.Flush方法调用可确保您可能已将所有写入响应流的数据“刷新”到客户端,Response.End可确保将所有当前缓冲的数据正确发送到客户端,并且还会引发您可能想要处理的EndRequest事件。

您还可以使用HttpApplication's CompleteRequest()方法。

MSDN documentation表示最佳:

  

此方法终止连接   以一种突然的方式对客户   不适用于普通的HTTP   请求处理。该方法发送一个   将数据包重置到客户端,可以   导致缓冲的响应数据   在服务器,客户端或   介于两者之间的某个地方。

     

您可以使用此方法作为回应   恶意HTTP攻击   客户。但是,通常你应该这样做   如果是,请调用CompleteRequest()   你想跳到前面   EndRequest事件并发送响应   给客户。

答案 2 :(得分:1)

根据我的经验,没有理由在您提供的代码示例中调用Response.Close();,只需删除它即可。

在触发Page_Load后的页面生命周期中,还会调用许多其他方法来关闭您的响应。

Read here for the Page Lifecycle

答案 3 :(得分:1)

回答问题1:

当您需要终止连接时,您应该呼叫Response.Close() - 也就是说,根本不需要将任何其他内容发送到客户端。这不包括您发布的内容,因为页面的 rest 需要处理并发送到客户端。通常,在从aspx页面返回不是页面的数据时会调用它(例如pdf文件,图像等......)。

回答问题2:

您不应在Response.Close()事件处理程序中调用Page_Load - 这意味着page lifecycle的其余部分将无法正常运行。

来自MSDN(HttpResponse.Close method):

  

此方法以突然方式终止与客户端的连接,并非用于正常的HTTP请求处理。该方法向客户端发送重置数据包,这可能导致在服务器,客户端或其间某处缓冲的响应数据被丢弃。

答案 4 :(得分:1)

.NET是一个非常灵活的网络,它可以让你在.NET之前做任何事情。 (更明显的是)。但最奇妙的是,.NET会照顾你可以为你处理的事情。

这意味着如果您创建并清空网页并在浏览器中运行它,则无需执行任何其他操作即可使其正常工作。

然而,有时您可能会发现自己处于需要做一些非凡事情的情况下,您会感谢Reponse.Close()

等函数的存在

在你的情况下,你没有做这样的事情,所以不需要任何特殊的函数调用。

此外Response.Write()是我们过去常用的东西......你还在想经典的ASP模式吗?

建议:不要使用Response.Write()

但是在您的网页上添加标签并使用:

this.Label1.Text = "Hello world";

其他评论:

ASP.Net的目的特别是将网页发送到浏览器,收集任何发布的数据,处理它,与服务器操作系统交互等等。

因此,在我看来,您可能会认为已经采取了一些措施:1)快速提供页面; 2)当用户遵循有关如何编写.Net网页的指导方针时,确保没有任何问题。

无需实现ALL Page事件处理程序。理解框架,了解每个页面事件的作用,并了解何时实现哪个事件。

如果您只是要显示数据库中的数据,则甚至不需要事件处理程序。 阅读有关数据控件(数据源,GridView,ListView,Repeater等)的信息。

假设如果你什么也不做,框架会为你做。 (如果你什么都不做,没有任何反应,那就是设计)

干杯。