2009-07-17 3 views
0

Есть ли шанс показать загрузочный бар при создании чего-то в цикле с классическим asp?Загрузочная панель с классическим asp

Я подумал о некоторых барах загрузки ajax-стиля, которые показывают, что страница создает что-то.

Я попытался сделать это с переменными сеанса, которые содержат информацию о состоянии процесса, но на этом я узнал, что серверы asp имеют очередь, что означает, что вы можете одновременно запускать только одну страницу asp.

При загрузке asp-страницы я не могу открыть другую asp-страницу на сервере sam с тем же сеансом. С новым сеансом это возможно, но я хочу работать с тем же сеансом (если это возможно).

Мысли: Можно ли выполнить запрос ajax, который запрашивает asp-страницу и показывает загрузочную панель во время загрузки страницы?

Есть ли какое-либо обходное решение для работы панели состояния?

(простите за плохой английский) Спасибо

Edit:

Я этот путь, но я не могу получить доступ к переменной сеанса через ASP-страницы. Страница чтения сеанса дает мне только ответ после завершения первого запроса asp. Я думаю, что это сеанс-очередь.

это выглядит для меня:

Аякса страница - (запрос процесса осины страница) -> process.asp

(такая же Аякса страница) - (запрос страница читателя сессии) -> sessionreader .asp

пока sessionstatus! = 100 показать процесс бар

проблема я получил ответ от sessionreader.asp, когда process.asp делается. Вот почему я думаю, что это asp-session-queue-think.

Возможно, это сработает, если второй запрос получит новый идентификатор сеанса (если это вообще возможно)?

ответ

1

Раньше был трюк с отключением Response.Buffer (установите его на false) или пусть он буферизуется, но время от времени вы выполняете Response.Flush, так как хотите обновить свой прогресс.

Итак, скажите, что у вас есть индикатор выполнения где-то в верхней части вашей страницы (изображение или таблица или div или что вы хотите), и как вы что-то делаете в сценарии asp (скажем, в цикле), время от времени , сбросьте javascript обратно клиенту, чтобы обновить индикатор выполнения, который должен быть уже на экране. что-то вроде:

<% 
    REM Might be a good idea to set the timeout to some large number here... 
    Response.Timeout = ... 
%> 
<html> 
: 
<body> 
    <p>Please wait...<span id="progress">0</span>% completed.</p> 
    : content here... 
    <% 
    REM Make sure the things above this get sent to the client first 
    REM so they will be rendered before the rest of the page is rendered. 
    Response.Flush() 

    For iCnt = 0 To 100 
    REM Do some stuffs here... 

    %> 
    <script>$("#progress").html(i)</script> 
    <% 
    Response.Flush() 
    Next 
    %> 
    : some more contents here... 
</body> 
</html> 

Я не уверен, что это все еще работает с современными браузерами, не используйте его в какое-то время.

+0

Yikes! Я не видел заявления REM годами. ;) – AnthonyWJones

+0

LOL, я не был в мире vb/vbscript с .NET :) даже во время ASP-дня я предпочитаю писать свой скрипт сервера, используя jscript, а не ближе к концу :). –

+0

Я попробовал это, и это сработало для меня прекрасно, я постараюсь написать его в jscript (я думаю, что это не проблема), а затем объединить его с моим asp-кодом. Спасибо – OemerA

3

Вы можете вызвать анимацию GIF на стороне клиента, как только вы отправите запрос.

+0

Это не отображает индикатор хода в реальном времени. –

+1

Правильно. Но большинство индикаторов прогресса не в режиме реального времени. В основном это признаки «действия в процессе, терпеливые». Хотя есть некоторые исключения, такие как загрузка файлов в GMail, которая основана на Flash IMHO. – EFraim

+0

+1 Разумное прагматическое решение. – AnthonyWJones

0

Вы не сможете сделать это, используя только одну страницу asp. Вам понадобится страница, которая будет показана пользователю (где вы будете продолжать жить в баре). Затем вам нужно будет сделать ajax-вызов (с jQuery ??) в цикле на страницу, которая читает объект сеанса. И вам понадобится страница, которая на самом деле выполняет вашу обработку и записывает ее статус в сеанс, который периодически контролируется вызовом ajax. Вам необходимо будет совершать периодические вызовы с помощью ajax для проверки сеанса с течением времени, пока вы не достигнете конечного результата. Вы можете сохранить число в сеансе, скажем, 1-100, если это очень длинный медленный процесс ... но 10, 20, ..., 100, вероятно, будут работать лучше всего. Когда вы доберетесь до 100, вы разобьете петлю и больше не будете опросить страницу чтения сеанса.

Причина этого в том, что вам нужна страница для отображения пользователю для вашего бара.

Страница, которая выполняет обработку, не может показать ничего пользователю до тех пор, пока не будет выполнена обработка.

Страница, которая просто читает сеанс, может быстро обрабатывать и быстро показывать свои результаты.

Имеют смысл?

0

Вы на правильном пути, что проблема в том, что вы работаете в Windows XP и сталкиваетесь с ограничением, которое IIS 5 обрабатывает только один запрос за раз.
Как вы подозреваете, запрос AJAX на прогресс не возвращается, пока не будет выполнен первоначальный запрос, который вы пытаетесь контролировать.

Невозможно обойти эту проблему с этой версией IIS. Скорее всего, это еще одно ограничение, позволяющее вам не использовать XP IIS 5 в производственной среде. Даже если второй запрос поступает с другого компьютера с другим IP-адресом, он не будет обрабатываться до тех пор, пока первый не будет завершен.

+0

Спасибо, я думаю, что вы правы, но я попытался открыть процесс process.asp в firefox, а sessionreader.asp в IE в нем отлично работает. В моем отчаянии я написал статус в файле и прочитал его с sessionreader.asp (я знаю, что это ужасное обходное решение) Это работает, но если вы хотите открыть оба файла (process.asp и sessionreader.asp), я получаю ответ из sessionreader.asp, когда процесс process.asp сделан. Вот почему я думаю, что его сессия основана на очереди. – OemerA

Смежные вопросы