ASP.NET页面加载由于位图而运行两次。保存

ASP.NET页面加载由于位图而运行两次。保存,asp.net,vb.net,bitmap,pageload,Asp.net,Vb.net,Bitmap,Pageload,我已经创建了一个VB.NET页面来记录广告的浏览量,并将从img src调用该页面 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim insert_number As Integer = 0 Dim ad_id As Integer = 0 If Request.QueryString("adid") Is Nothing Then ad_i

我已经创建了一个VB.NET页面来记录广告的浏览量,并将从img src调用该页面

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

    Dim insert_number As Integer = 0
    Dim ad_id As Integer = 0

    If Request.QueryString("adid") Is Nothing Then
        ad_id = 0
    Else
        If Not Integer.TryParse(Request.QueryString("adid"), ad_id) Then
            ad_id = 0
        End If
    End If

    Dim connectStr As String = System.Configuration.ConfigurationManager.AppSettings("connectStr").ToString()
    Dim myconnection As SqlConnection = New SqlConnection(connectStr)
    Dim mySqlCommand As SqlCommand
    myconnection.Open()

    Try
        mySqlCommand = New SqlCommand("sp_record", myconnection)
        mySqlCommand.CommandType = CommandType.StoredProcedure
        mySqlCommand.Parameters.AddWithValue("@record_id", ad_id)
        insert_number = mySqlCommand.ExecuteNonQuery()
    Catch ex As Exception

    End Try
    myconnection.Close()

    Dim oBitmap As Bitmap = New Bitmap(1, 1)
    Dim oGraphic As Graphics = Graphics.FromImage(oBitmap)       
    oGraphic.DrawLine(New Pen(Color.Red), 0, 0, 1, 1)

    'Response.Clear()
    Response.ContentType = "image/gif"

    oBitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif)

    'oBitmap.Dispose()
    'oGraphic.Dispose()

End Sub
除非我对oBitmap.Save行进行注释,否则代码将运行两次,并向数据库进行两次插入(store prcoedure运行两次)

我在@PAGE上尝试了AutoEventWireup=“true”和“false”。“true”运行代码两次,“false”没有执行任何操作(没有错误),也没有给出任何输出

我也尝试过创建1像素图像输出的以下版本,但它也运行了两次(在@PAGE part中需要aspcompat=true):


欢迎您提出任何想法。

您可能需要对图像执行一个onload函数,以了解第二次调用图像的原因。我猜它在预加载的某个地方被加载,然后在页面加载过程中被调用(.Save),这就是为什么您会看到双条目

如果您试图获得唯一的页面加载,您可能希望尝试将oBitmap.Save行放入页面加载中的回发检查中,如下所示:

If Page.IsPostback = False Then
    'Bitmap Code Here
End If
看看这是否能帮你解决问题

如果从数据库加载数据,则需要确保它也在回发检查范围内(因为a.加载数据两次,b.在某些情况下可能会导致这些双重回发)


编辑:希望编辑代码部分以包含所有位图代码,而不仅仅是保存。

不确定具体内容,但在页面加载功能中有大量代码


一般来说,我解决这类问题的方法是使用一些页面参数,您可以检查这些参数,以便执行正确的操作。在调用中添加一些get/post参数,您可以检查这些参数,或者检查页面。iPostback

我知道这是一篇旧文章,但我遇到了一个类似的问题,页面在回发时触发了两次。我发现有几篇帖子在暗示这里正在讨论什么。但是,纠正我的问题的是在页面级别设置页面指令属性AutoEventWireup=false

这是一篇帮助我解决这个问题的好文章

希望这有帮助


Risho

我添加了Page.ISPostback部分。如果我从标记调用所有代码,所有代码都可以正常工作,但是如果我直接从URL调用页面,它可以工作两次,即使所有内容都在页面内。IsPostback checkOk,听起来像是发生了什么,因为代码在加载过程中被加载,它被加载,然后在加载图像本身时再次初始化。您可以做一些检查,看看代码是否被页面或img调用,然后如果代码被页面调用,就不执行代码?或者,另一种选择是将此代码放入img的load函数(更改为asp:image控件)中,然后查看是否只调用一次。我今天会玩弄它,看看是否可以复制/解决这个问题。为了澄清问题,代码似乎在页面加载时运行,然后在图像代码返回数据时再次运行。今天早上我会看一看,看看我有什么想法。好的,我不能用我的开发机器提供的代码来复制您遇到的问题。不管页面如何调用,我只调用了一次(page_load),db代码只调用了一次。当然,我已经注释掉了您的DB代码,并在其中添加了一个小变量,这样我就可以包含一个断点。该变量仅在页面加载时被引用一次。尝试注释DB代码(我知道最终结果需要它,但仅针对此测试),并在其中放置一个变量和断点,看看是否为您调用了两次。
If Page.IsPostback = False Then
    'Bitmap Code Here
End If