Я использую ASP.NET +.Net 3.5 + VSTS 2008 + IIS 7.0 + C# для разработки веб-приложения. Я нахожу при отладке в 2008 VSTS, если я называю Ответ. Близко () метод в page_load (относитесь для кодирования ниже), будет ошибка (от IE при доступе к странице) как, не может соединиться с сервером.
Мой вопрос,
BTW: мое предыдущее понимание является разработчиком, должен всегда называть Ответ. Близко, когда обработка завершается в стороне сервера, и все данные были записаны в клиент, использующий Ответ. Записать. Я корректен?
2, Почему я встретился с такой ошибкой в своем коде? Какова первопричина?
protected void Page_Load(object sender, EventArgs e) { Response.Write("Hello World! "); Response.Close(); }
Здесь может быть полезно следующее из веб-сайта MSDN :
Этот метод прерывает соединение с клиентом внезапно и не предназначен для обычного HTTP-запроса. обработка.Этот метод отправляет клиенту пакет сброса, который может привести к удалению данных ответа, которые буферизированы на сервере, клиенте или где-то между ними.
Вы можете использовать этот метод в ответ на атаку злонамеренного HTTP-клиента. Однако обычно вам следует вместо этого вызвать CompleteRequest, если вы хотите перейти к событию EndRequest и отправить ответ клиенту.
По моему опыту нет оснований называть Response.Close();
в приведенном вами примере кода просто удалите его.
В жизненном цикле страниц после запуска Page_Load будет вызван ряд других методов, которые закроют ваши ответы для вас.
Обычно не следует использовать метод 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 и отправьте ответ клиенту.
Чтобы ответить на вопрос 1:
Вы должны вызвать Response.Close ()
, когда вам нужно прервать соединение, то есть, больше ничего не нужно отправлять клиенту. Это не включает то, что вы опубликовали, поскольку остальная часть страницы должна быть обработана и отправлена клиенту. Обычно вы вызываете его при возврате данных, которые не являются страницей со страницы aspx (например, файл pdf, изображение и т. Д.).
Чтобы ответить на вопрос 2:
Вы не должны вызывать Response.Close ()
в обработчике событий Page_Load
- это будет означать, что остальная часть страницы жизненный цикл не будет работать должным образом.
Из MSDN ( HttpResponse.Close метод ):
Этот метод прерывает соединение с клиентом внезапно и не предназначен для нормальной обработки HTTP-запросов. Этот метод отправляет клиенту пакет сброса, который может привести к удалению данных ответа, которые буферизированы на сервере, клиенте или где-то между ними.
.NET - очень гибкая сеть, она позволит вам делать все, что вы могли до .NET. (и более очевидно). Но самое замечательное то, что .NET позаботится обо всем, о чем может позаботиться за вас.
Это означает, что если вы создаете и очищаете веб-страницу и запускаете ее в своем браузере, вам не нужно ничего делать, чтобы она работала.
Однако иногда вы можете оказаться в ситуации, когда вам нужно сделать что-то экстраординарное, и вы будете благодарны за существование таких функций, как Reponse.Close ()
В вашем случае вы этого не делаете вещь, поэтому нет необходимости в вызове каких-либо специальных функций.
Кроме того, Response.Write ()
- это то, что мы использовали раньше ... Вы все еще думаете в классическом режиме ASP?
Предложение: не используйте Response.Write ()
Но поместите метку на свою веб-страницу и используйте:
this.Label1.Text = "Hello world";
Дополнительный комментарий:
В частности, цель ASP.Net - отправлять веб-страницы в браузер, собирать все опубликованные данные, обрабатывать их, взаимодействовать с ОС сервера и так далее.
Так что, на мой взгляд, вы можете предположить, что были предприняты определенные меры для 1) быстрого обслуживания страниц и 2) обеспечения того, чтобы ничего не пошло не так, когда пользователь следует инструкциям по программированию веб-страниц .Net.
Нет необходимости реализовывать ВСЕ обработчики событий страницы. Изучите структуру, поймите, что делает каждое событие страницы, и узнайте, когда какое событие реализовать.
Если вы собираетесь отображать данные только из базы данных, вам даже не нужны обработчики событий. Прочтите об элементах управления данными (источники данных, GridView, ListView, Repeater и т. Д.).
Предположим, что если вы ничего не сделаете, каркас сделает это за вас. (ЕСЛИ вы вообще ничего не делаете, ничего не происходит, это задумано)
Ура.