Постепенно выводите поток вывода страницы ASP.NET - или визуализируйте страницу вне HTTP-запроса - PullRequest
1 голос
/ 13 мая 2010

У меня есть страница ASP.NET 2.0 со множеством повторяющихся блоков, включая сторонний серверный элемент управления (так что это не просто HTML). Каждый из них достаточно дорог для генерации с точки зрения как процессора, так и оперативной памяти. В настоящее время я использую для этого стандартный элемент управления Repeater.

У этого простого подхода есть две проблемы:

  1. Вся страница должна быть обработана до того, как какая-либо ее часть будет возвращена клиенту, поэтому пользователь должен долго ждать, прежде чем он увидит какие-либо данные. (Я пишу сообщения о прогрессе, используя Response.Write, поэтому есть обратная связь , но фактических результатов нет.)
  2. Рабочий процесс ASP.NET должен хранить все в памяти одновременно. В этом нет необходимости: после обработки одного блока он не изменится, поэтому его можно будет вернуть клиенту и освободить память.

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

Другим способом было бы сделать что-то похожее, но на сервере: создать отдельную страницу, но иметь сервер доступ к ней и затем Response.Write() HTML-код, который он получает в поток ответов для реальный клиентский запрос. Есть ли способ избежать HTTP-запроса здесь, хотя? Есть ли какой-нибудь метод ASP.NET, который выводил бы UserControl или Page за пределы HTTP-запроса и просто возвращал мне HTML в виде строки?

Я открыт для других идей о том, как это сделать.

Ответы [ 3 ]

1 голос
/ 13 мая 2010

Другим способом было бы сделать что-то похожее, но на сервере: все равно создать отдельную страницу, но иметь доступ к ней сервера, а затем Response.Write () HTML-код, который он получает в поток ответов для реального запроса клиента.

Вы можете сделать это, если извлечете содержимое каждой строки репитера в UserControl. Затем вы можете динамически (если необходимо) загрузить элемент управления, используя метод LoadControl , дать ему правильные данные, которые он должен отобразить (при необходимости вызвать DataBind), а затем отобразить его в потоке ответов, используя Render метод. Это в основном то, что вы имели в виду, не беспокоясь о создании совершенно нового запроса.

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

0 голосов
/ 13 мая 2010

Выполнение ajax-вызовов к веб-сервису для получения частичных HTML-результатов. Вы можете использовать ViewManager, описанный здесь, чтобы отобразить веб-элементы управления в вашем веб-сервисе и вернуть полученный HTML-код.

http://weblogs.asp.net/scottgu/archive/2006/10/22/Tip_2F00_Trick_3A00_-Cool-UI-Templating-Technique-to-use-with-ASP.NET-AJAX-for-non_2D00_UpdatePanel-scenarios.aspx

0 голосов
/ 13 мая 2010

Этот способ не использует AJAX:

<div><script src="pageparts.aspx?partid=news"/></div>
<div><script src="pageparts.aspx?partid=weather"/></div>
<div><script src="pageparts.aspx?partid=email"/></div>

Как это работает: pageparts.aspx испускает javascript, который создает соответствующую часть страницы. Детали не будут отображаться в любом предсказуемом порядке. Вы, вероятно, захотите исправить расположение частей, чтобы страница не перепрыгивала, когда она заполнялась.

В результате получается что-то вроде iGoogle.com (именно поэтому я использовал такие URL-адреса).

Ваш код на стороне сервера будет выглядеть так:

<asp:Repeater id="rpParts" runat="server">
    <ItemTemplate>
        <div><asp:Literal id="litPart" runat="server"/></div>
    </ItemTemplate>
</asp:Repeater>

Вы генерируете тег <script> в коде позади. Весь код, который фактически строит данные и помещает их в большой document.write(), входит в pageparts.aspx

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

Редактировать

вся проблема в "коде, который на самом деле строит данные "! Если я может получить это как строку

Это не имеет большого смысла для меня. Что вы сейчас отправляете клиенту и как вы его строите?

Кроме того, для полноты картины приведем чисто не-JavaScript-подход:

<div><iframe src="part1.aspx"/></div>
<div><iframe src="part2.aspx"/></div>
<div><iframe src="part3.aspx"/></div>

Это некрасиво, и обычно выглядит так, будет работать, даже если у вас нет контроля над данными.

...