Page_Init и Page_Load дважды выполняет ASP и VB.NET только в IE .. почему?

Странная проблема сегодня. Мне удалось исправить другие мои проблемы. Моя страница ASP не содержит элементов управления (поэтому нет пустых 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, но это не имеет значения. Я попытался удалить заголовок, информацию о кеше и т. Д., Но безуспешно. Пожалуйста помоги!

Спасибо


person user2965112    schedule 09.12.2013    source источник
comment
Возможно, это вызывает проблему sitepoint.com/ie-contype-request   -  person jbl    schedule 09.12.2013
comment
попробуйте запустить скрипач и посмотрите, не вызывается ли страница дважды из-за аутентификации. Если это не аутентификация, вы все равно узнаете, почему выполняется второй запрос на получение.   -  person NoviceProgrammer    schedule 09.12.2013
comment
@jbl Думаю, ты что-то понял. Теперь у меня есть временное решение, выполнив следующие действия: 1) Каждый раз проверяя содержимое заголовков. При первом запуске кода их 7, при втором запуске кода 6. Тот, который исчезает во второй раз, это Accept-Language. 2) Получите количество заголовков (7), и если оно меньше 7, то это второй раз, когда код запускается 3) писать в журнал базы данных, только если headers.keys.count ‹7. Теперь проблема в том, что я хочу чтобы улучшить код и сделать его менее жестко запрограммированным. Если возможно, сообщите об этом с помощью примера vb.net? Спасибо!   -  person user2965112    schedule 09.12.2013
comment
i39.tinypic.com/1ftllc.jpg, пожалуйста, посмотрите изображение в первый и второй раз код бежит. Приведенная вами ссылка предлагает ссылку на PHP и выясняет, ПОЛУЧАЕТ ли запрос пользовательский агент. Я понимаю большинство теорий относительно того, почему это происходит сейчас, но был бы очень признателен за пример / решение vb.net. еще раз, я очень ценю вашу помощь.   -  person user2965112    schedule 09.12.2013
comment
После тестирования моего кода в двух средах (Windows 7 / IE11 / Visual Studio 2012 и Windows XP / IE8 / VS2005) оказалось, что в обеих средах заголовок Accept-Language всегда будет «Ничего» во второй раз, когда код выполняется. Я могу использовать эту информацию, чтобы обойти мою проблему, проверив, что Accept-Language равно Nothing, и выполнив If ... Then. Спасибо за помощь; если у вас есть предложения по очистке, дайте мне знать. Я проверил значение HTTP_USER_AGENT, как было предложено, но в обоих исполнениях это имя строки моего браузера, а не «contype», как было предложено. Спасибо   -  person user2965112    schedule 09.12.2013
comment
Если useragent такой же, у меня есть только одно предложение - сравнить Request.HttpMethod в обоих случаях   -  person jbl    schedule 09.12.2013
comment
К сожалению, они оба являются значениями GET каждый раз при выполнении кода, но спасибо; Я думаю, что могу использовать значение заголовка Accept-Language для запуска своего кода на основе значения :)   -  person user2965112    schedule 09.12.2013
comment
В качестве быстрого продолжения; мое веб-приложение по-прежнему не работает правильно в IE10, но работает в IE11 и в каждом IE до IE8 (включительно) с непроверенным IE9. При работе в IE10 2 запроса GET не выполняются, и я просто получаю значок ошибки (маленький черный прямоугольник с буквой x) - какая-либо причина, почему это может быть?   -  person user2965112    schedule 10.12.2013


Ответы (1)


Вы действительно не должны использовать Response.Close так *. Это действительно просто для защиты от атак или других условий, вызывающих ошибки.:

Этот метод прерывает соединение с клиентом внезапно и не предназначен для нормальной обработки HTTP-запросов. Этот метод отправляет клиенту пакет сброса, который может привести к удалению данных ответа, которые буферизированы на сервере, клиенте или где-то между ними.

Вы можете использовать этот метод в ответ на атаку злонамеренного HTTP-клиента. Однако обычно вам следует вместо этого вызвать CompleteRequest, если вы хотите перейти к событию EndRequest и отправить ответ клиенту.

И это вызовет проблемы, очень похожие на те, которые вы описываете (потому что он отправляет клиенту запрос на «сброс»). Попробуйте обновить свой код, чтобы использовать Response.CompleteRequest вместо этого, и это должно (вероятно) решить ваши проблемы с "множественными запросами".

* См. это сообщение в блоге для подробного анализа того, почему: Response.End, Response.Close и как отзывы клиентов помогают нам улучшить документацию MSDN

person Josh Darnell    schedule 09.12.2013
comment
Мое плохое, я уже цитировал ранее документацию Response.End. Но действует тот же совет. - person Josh Darnell; 09.12.2013