Page_Init和Page_Load执行两次ASP& VB.NET只在IE中..为什么?

时间:2013-12-09 12:48:41

标签: asp.net vb.net postback httpresponse pageload

今天遇到一个奇怪的问题。我设法解决了其他问题。我的ASP页面包含NO控件(因此没有可能导致问题的空白图像URL)。程序本身,从VB代码后面,从数据库中获取二进制数据,并对页面执行Response.BinaryWrite(imagedata)。当我在Chrome或Firefox中运行它时,一切都很完美。当我在IE中运行时,在我的代码完成执行后,它再次运行Page_Init并再次运行Page_Load,就好像第一次重新加载一样。回发的值总是假的,所以没有办法解决它。这是asp代码(你可以看到,没什么兴趣)......

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="pagenamehere.aspx.vb" Inherits="x.x.x.x.y" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Test</title>
</head>

<body>
</body>
</html>

Page_Init和Page_Load签名如下

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
'checks database connection string and handles error if there is one
End Sub

Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
'checks user is authenticated to view the image and if so, does the binarywrite
End Sub

我已经尝试将autoeventwriteup更改为true并取消处理Me.Load等但没有效果。我也尝试检查Sender对象,但是第一次加载页面和页面不需要的第二次加载之间没有任何变化。

最后,页面在以下代码

之后第二次加载
                Response.Clear()
                Response.ClearContent()
                Response.ClearHeaders()
                Response.Buffer = True
                Response.ContentType = "image/vnd.djvu"
                Response.AddHeader("Content-Disposition", "inline;filename=temp.djvu")
                Response.Cache.SetCacheability(HttpCacheability.NoCache)
                Response.BinaryWrite(imagedata)
                Response.Flush()
                Response.Close()

在Response.Close之后直接它将返回到Page_Init。我已经尝试过response.end但它没有任何区别。我试过删除标题,缓存信息等但没有运气。请帮忙!

由于

1 个答案:

答案 0 :(得分:0)

你真的不应该像那样使用Response.Close *。这真的只适用于protecting against attacks or other error-type conditions

  

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

     

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

它将导致与您描述的问题非常相似的问题(因为它向客户端发送“重置”请求)。尝试更新您的代码以使用Response.CompleteRequest,这应该(可能)解决您的“多个请求”问题。

* 请参阅此博客文章,深入分析原因:Response.End, Response.Close, and How Customer Feedback Helps Us Improve MSDN Documentation