Ответ ASP.NET. Близкая проблема

Я использую ASP.NET +.Net 3.5 + VSTS 2008 + IIS 7.0 + C# для разработки веб-приложения. Я нахожу при отладке в 2008 VSTS, если я называю Ответ. Близко () метод в page_load (относитесь для кодирования ниже), будет ошибка (от IE при доступе к странице) как, не может соединиться с сервером.

Мой вопрос,

  1. Обычно, когда должен мы называть Ответ. Близко ()? Или никакая потребность звонить (полагаются на платформу ASP.Net для автоматического закрытия)?

BTW: мое предыдущее понимание является разработчиком, должен всегда называть Ответ. Близко, когда обработка завершается в стороне сервера, и все данные были записаны в клиент, использующий Ответ. Записать. Я корректен?

2, Почему я встретился с такой ошибкой в своем коде? Какова первопричина?

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("Hello World! ");
        Response.Close();
    }
6
задан jessehouwing 29 December 2016 в 19:25
поделиться

5 ответов

Здесь может быть полезно следующее из веб-сайта MSDN :

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

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

10
ответ дан 8 December 2019 в 12:18
поделиться

По моему опыту нет оснований называть Response.Close(); в приведенном вами примере кода просто удалите его.

В жизненном цикле страниц после запуска Page_Load будет вызван ряд других методов, которые закроют ваши ответы для вас.

Читайте здесь для жизненного цикла страницы

1
ответ дан 8 December 2019 в 12:18
поделиться

Обычно не следует использовать метод Response.Close при "нормальной" обработке ASP.NET.

Все ваши данные, записываемые в «поток» HttpResponse , буферизуются перед отправкой в ​​браузер клиента. Метод Response.Close резко разорвет HTTP-соединение, и вы можете потерять данные, которые ранее были у вас Response.Written случайно.

Если вы действительно хотите программно "принудительно" завершить поток ответа, вы должны использовать: Response.Flush (); , за которым следует Response.End ();

Вызов метода Response.Flush гарантирует, что все данные, которые вы могли записать в поток ответа, «сбрасываются» клиенту, а Response.End гарантирует, что все текущие буферизованные данные правильно отправляется клиенту, а также вызывает событие EndRequest , которое вы можете захотеть обработать.

Вы также можете использовать метод CompleteRequest () HttpApplication .

В документации MSDN лучше всего сказано:

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

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

6
ответ дан 8 December 2019 в 12:18
поделиться

Чтобы ответить на вопрос 1:

Вы должны вызвать Response.Close () , когда вам нужно прервать соединение, то есть, больше ничего не нужно отправлять клиенту. Это не включает то, что вы опубликовали, поскольку остальная часть страницы должна быть обработана и отправлена ​​клиенту. Обычно вы вызываете его при возврате данных, которые не являются страницей со страницы aspx (например, файл pdf, изображение и т. Д.).

Чтобы ответить на вопрос 2:

Вы не должны вызывать Response.Close () в обработчике событий Page_Load - это будет означать, что остальная часть страницы жизненный цикл не будет работать должным образом.

Из MSDN ( HttpResponse.Close метод ):

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

1
ответ дан 8 December 2019 в 12:18
поделиться

.NET - очень гибкая сеть, она позволит вам делать все, что вы могли до .NET. (и более очевидно). Но самое замечательное то, что .NET позаботится обо всем, о чем может позаботиться за вас.

Это означает, что если вы создаете и очищаете веб-страницу и запускаете ее в своем браузере, вам не нужно ничего делать, чтобы она работала.

Однако иногда вы можете оказаться в ситуации, когда вам нужно сделать что-то экстраординарное, и вы будете благодарны за существование таких функций, как Reponse.Close ()

В вашем случае вы этого не делаете вещь, поэтому нет необходимости в вызове каких-либо специальных функций.

Кроме того, Response.Write () - это то, что мы использовали раньше ... Вы все еще думаете в классическом режиме ASP?

Предложение: не используйте Response.Write ()

Но поместите метку на свою веб-страницу и используйте:

this.Label1.Text = "Hello world";

Дополнительный комментарий:

В частности, цель ASP.Net - отправлять веб-страницы в браузер, собирать все опубликованные данные, обрабатывать их, взаимодействовать с ОС сервера и так далее.

Так что, на мой взгляд, вы можете предположить, что были предприняты определенные меры для 1) быстрого обслуживания страниц и 2) обеспечения того, чтобы ничего не пошло не так, когда пользователь следует инструкциям по программированию веб-страниц .Net.

Нет необходимости реализовывать ВСЕ обработчики событий страницы. Изучите структуру, поймите, что делает каждое событие страницы, и узнайте, когда какое событие реализовать.

Если вы собираетесь отображать данные только из базы данных, вам даже не нужны обработчики событий. Прочтите об элементах управления данными (источники данных, GridView, ListView, Repeater и т. Д.).

Предположим, что если вы ничего не сделаете, каркас сделает это за вас. (ЕСЛИ вы вообще ничего не делаете, ничего не происходит, это задумано)

Ура.

1
ответ дан 8 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: