ASP.Net Response.Закрыть проблему - PullRequest
6 голосов
/ 10 июля 2010

Я использую ASP.Net + .Net 3.5 + VSTS 2008 + IIS 7.0 + C # для разработки веб-приложения.Я обнаружил, что при отладке в VSTS 2008, если я вызову метод Response.Close () в page_load (см. Код ниже), будет ошибка (из IE при доступе к странице), например, невозможно подключиться к серверу.1002 * Мой вопрос:

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

Кстати: мое предыдущее понимание: разработчик всегда должен вызывать Response.Close, когда обработка завершается на стороне сервера и все данныебыло написано клиенту с помощью Response.Write.Я прав?

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

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("Hello World! ");
        Response.Close();
    }

Ответы [ 5 ]

10 голосов
/ 10 июля 2010

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

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

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

6 голосов
/ 10 июля 2010

Обычно вы не должны использовать метод 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 голос
/ 10 июля 2010

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

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

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

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

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

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

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

this.Label1.Text = "Hello world";

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

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

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

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

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

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

Приветствие.

1 голос
/ 10 июля 2010

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

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

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

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

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

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

1 голос
/ 10 июля 2010

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

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

Прочитайте здесь, чтобы узнать жизненный цикл страницы

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