由于Bitmap.Save,ASP.NET Page_Load运行两次

时间:2011-06-06 16:29:57

标签: 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_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行,否则代码会运行两次并且它会向数据库进行两次插入(将prcoedure运行两次)。

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

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

    '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)

欢迎任何想法。

3 个答案:

答案 0 :(得分:1)

您可能希望为图像执行onload功能,以查看为何第二次调用它。我猜测它在预加载中被加载到某个地方然后在页面加载期间被调用(.Save),这就是你看到双重输入的原因。

如果您尝试获取唯一的页面加载,您可能想尝试在页面加载中将oBitmap.Save行放入检查中以进行回发:

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

看看是否能为你修复它。

如果您正在从数据库加载数据,那么您需要确保它也在PostBack检查范围内(因为a。您正在加载数据两次而且b。它可能会导致某些数据的双回发)的情况下)。

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

答案 1 :(得分:1)

不确定具体细节,但这是Page_Load函数中的大量代码。

通常,我解决此类问题的方法是使用某种页面参数,您可以检查它们以执行正确的操作。在您可以检查的电话中添加一些 get / post 参数,或者检查 Page.IsPostBack 等内容。

答案 2 :(得分:0)

我意识到这是一个老帖子,但我有一个类似的问题,页面在回发上发射了两次。我发现有几个帖子在这里消解了什么。但是,更正了我的问题是在页面级别设置页面指令属性AutoEventWireup = false。

这是一篇很好的文章How to use the AutoEventWireup attribute in an ASP.NET Web Form by using Visual C# .NET,帮助我解决了这个问题。

希望这有帮助!

Risho