开发者

ASP.NET Page_Load runs twice due to Bitmap.Save

I have created an VB.NET page to record views for ads and will call page from 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

Unless I comment oBitmap.Save line, the code runs twice and it makes two inserts (store prcoedure runs twice) to Database.

I have tried AutoEventWireup = "true" and "false" at @PAGE. "true" runs code twice, "false" did not do anything (no error) and did not give any output as well.

I have also tried following version of creating 1pixel image output but it did run twice as well (it requires aspcompat=true in @PAGE part):

开发者_StackOverflow社区
    'Response.ContentType = "image/gif"
    'Dim objStream As Object
    'objStream = Server.CreateObject("ADODB.Stream")
    'objStream.open()
    'objStream.type = 1
    'objStream.loadfromfile("c:\1pixel.gif")
    'Response.BinaryWrite(objStream.read)

Any ideas are welcome.


You may want to do an onload function for the image to see why it's being called a second time. I'm guessing that it's getting loaded somewhere in the preload and then being called (.Save) during the page load as well and that's why you're seeing the double entry.

If you are trying to get unique page loads, you may want to try putting the oBitmap.Save line within a check for postback like this within the page load:

If Page.IsPostback = False Then
    'Bitmap Code Here
End If

And see if that fixes it for you.

If you're loading data from a database, you'll want to make sure that it also is within that PostBack check (because a. you're loading the data twice and b. it can cause these double postbacks in some circumstances).

Edit: Wanted to edit code section to include all bitmap code, not just the save.


Not sure about the specifics, but that is a lot of code within in Page_Load function.

Generally, the way I would solve this type of problem is to have some sort of page arguments that you can check for in order to do the correct things. Either add some get/post parameters to the call that you can check for or check things like the Page.IsPostBack.


I realize this is an old post but I had an similar issue where the page was firing twice on the postback. I found several posts sugesting what is being dicusses here. However, what corrected my issue was setting the page directive property AutoEventWireup=false at the page level.

Here is a good article How to use the AutoEventWireup attribute in an ASP.NET Web Form by using Visual C# .NET that helped me solve this.

Hope this helps!

Risho

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜