ASP.NET Page_Load запускается дважды из-за Bitmap.Save - PullRequest
1 голос
/ 06 июня 2011

Я создал страницу 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 запускается дважды) в базу данных.

Я пробовал AutoEventWireup = "true" и "false" на @PAGE.«true» запускает код дважды, «false» ничего не делал (без ошибок) и также не выдает никакого вывода.

Я также пытался использовать следующую версию создания вывода изображения в 1 пиксель, но он также выполнялся дважды (для него требуется aspcompat = true в части @PAGE):

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

1 голос
/ 06 июня 2011

Не уверен насчет специфики, но это много кода в функции Page_Load.

Как правило, я бы решил проблему такого типа, чтобы иметь какие-то аргументы страницы, которые вы можете проверитьдля того, чтобы делать правильные вещи.Либо добавьте некоторые параметры get / post к вызову, которые вы можете проверить, либо проверьте такие вещи, как Page.IsPostBack .

1 голос
/ 06 июня 2011

Вы можете захотеть сделать функцию загрузки для изображения, чтобы понять, почему оно вызывается во второй раз. Я предполагаю, что он загружается где-то в предварительной загрузке, а затем вызывается (.Save) во время загрузки страницы, и поэтому вы видите двойную запись.

Если вы пытаетесь получить уникальную загрузку страницы, вы можете попробовать поместить строку oBitmap.Save в проверку обратной передачи, как это происходит при загрузке страницы:

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

И посмотри, исправит ли это для тебя.

Если вы загружаете данные из базы данных, вы должны убедиться, что они также находятся в пределах этой проверки PostBack (потому что: a. Вы загружаете данные дважды и b. Это может вызвать такие двойные обратные передачи в некоторых обстоятельства).

Редактировать: хотел отредактировать раздел кода, включив в него весь растровый код, а не только сохранение.

0 голосов
/ 10 января 2013

Я понимаю, что это старая запись, но у меня была похожая проблема, когда страница дважды запускалась при обратной передаче.Я нашел несколько сообщений, предлагающих, что здесь обсуждается.Однако, что исправило мою проблему, установив свойство директивы страницы AutoEventWireup = false на уровне страницы.

Вот хорошая статья Как использовать атрибут AutoEventWireup в веб-форме ASP.NET с помощью VisualC # .NET , который помог мне решить эту проблему.

Надеюсь, это поможет!

Risho

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...