chuprinka
Новенький
Offline
|
|
« : 16-03-2012 12:10 » |
|
Добрый день,
я столкнулась со следующей проблемой, у меня есть web application, на которой есть 4 textbox для ввода информации, button и textBox - для вывода информации. По click на button, срабатывает событие, код представлен ниже protected void Button1_Click(object sender, EventArgs e) { string sourceDomain = TextBox1.Text; string sourceOrganization = TextBox2.Text; string targetDomain = TextBox3.Text; string targetAccount = TextBox4.Text; initilaze = new Initialize(sourceDomain, sourceOrganization, targetDomain, targetAccount, TextBox6); initilaze.CompareAttributes(); } Выполнение этих методов занимает минуты 3-4, таким образом информация в TextBox6 выведется только после отработки Button1_Click события. В десктопных приложениях этf проблема решалось использованием InvokeRequired и текст выводился по мере его добавления в textBox.
Для web app я прочитала, что есть связка ScriptMaster, UpdatePanel, Timer и хотела сделать следующим образом, чтобы через каждые 5 секунд, UpdatePanel обновлялась и содержимое TextBox6 выводилось. Но я столкнулась с тем же результатом, текст в TextBox выводится только после отработки события. Ниже приведено описание формы
<asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional"> <ContentTemplate> <asp:Button ID="Button1" runat="server" Text="CompareAttributes" onclick="Button1_Click" onclientclick="Button1_Click" Font-Size="Small" Width="242px" /> <asp:TextBox ID="TextBox6" runat="server" Height="188px" Width="880px" TextMode="MultiLine" AutoPostBack="True"></asp:TextBox> <br /> </ContentTemplate> </asp:UpdatePanel>
Пожалуйста, подкиньте идей, подскажите, в чем моя ошибка и как можно решить данную проблему.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #1 : 16-03-2012 14:30 » |
|
Тут нужно понимать, как работает вся инфраструктура.
Перво-наперво, протокол HTTP 1.1 работает обычно с использованием сессий. Т.е. из браузера к серверу устанавливается TCP-соединение, по которому последовательно передаются HTTP-запросы.
Соответственно, пока предыдущий запрос не отработал, все последующие запросы "стоят" в очереди.
Это создаёт проблему при разработке "классических" веб-приложений в случае либо длительно обрабатываемых запросов (твой случай), либо длительной передачи данных (обычно загрузка и скачивание файлов).
В новой модели веб-приложений, использующих AJAX, обе проблемы могут быть решены, если на стороне сервера запросы обрабатываются веб-сервисом без сессии, как это было когда-то давно в HTTP 1.0. Это несколько медленнее с точки зрения передачи данных, т.к. требует на каждый запрос создавать отдельное TCP-соединение, зато развязывает проблему "параллельности" нескольких запросов.
В "классической" модели веб-приложений проблема долгой передачи данных разрешается с помощью механизма частичных запросов, поддерживаемого HTTP 1.1 (его активно используют разные "качалки", ведущие закачку файлов в несколько параллельных потоков). Для веб-приложения запросы частей файла (или потока данных) могут чередоваться со вспомогательными запросами (например, получение статуса текущих процессов, прогресса и т.п.).
Проблема же долгой обработки запроса в "классической" модели решается совсем просто: посланный из браузера запрос запускает на сервере асинхронную задачу и тут же возвращает ответ (например со статусом или прогрессом операции); дальше из браузера JavaScript по таймеру периодически посылает запросы на сервер с целью обновить статус операции. И в конце концов получает ответ, что операция была завершена. Неудобство тут в том, что без AJAX вся страница будет периодически "моргать" сбрасывая фокус ввода в пользовательской форме (если она есть).
Вот это возможные пути решения проблемы. Скажи, какой тебе больше нравится, и потом детализируем его реализацию.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
chuprinka
Новенький
Offline
|
|
« Ответ #2 : 16-03-2012 15:11 » |
|
Спасибо за быстрый отклик, я бы хотела попробовать использовать AJAX, пожалуйста, подскажи, с чего мне начать
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #3 : 16-03-2012 18:02 » |
|
chuprinka, ASP.NET, начиная с той версии, которая входит в VS 2008, поддерживает AJAX. Однако, разумеется, AJAX там "упрятан" в недра самого ASP.NET.
Начать можно с создания AJAX веб-страницы. Разобраться, как и что в ней работает.
Краткая суть AJAX:
Браузер заходит на некую страничку, содержащую богатый JavaScript-код. Этот код выстраивает динамический HTML страницы - формирует её внешний вид, обрабатывает все действия пользователя и т.п.: является так называемым "толстым" клиентом при "тонком" сервере. Это принципиально отличается от "классических" веб-приложений, где HTML-код формируется на стороне сервера по результатам запросов. По мере реализации логики работы динамической веб-страницы JavaScript-код посылает серверу асинхронные запросы либо на получение данных, либо отсылая пользовательские данные. Делается это в "фоновом" режиме: страница не перезагружается с сервера.
Поскольку ASP.NET исторически возникла как фреймворк для "классических" веб-приложений, в ней сохранилась "классическая" вёрстка HTML-страниц с веб-контролами ASP.NET - вроде той, которую ты привела. (Причём уже по тэгу ScriptManager видно, что у тебя нужная версия ASP.NET.) Это несколько сбивает с толку разработчиков, поскольку мешает им переключить свои мозги на динамический HTML, но в общем и целом жить можно. Принципиальная разница между обычной веб-страницей и AJAX веб-страницей начинается уже с того, что обработчики "кликов" на контролах у первой расположены в серверном коде (на C#), а у второй - в клиентском (на JavaScript). ASP.NET "прячет" от разработчика механизм общения браузера с сервером: все сопутствующие клиентские скрипты и серверный код генерируются автоматически, так что можно сосредоточиться на прикладной задаче.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
|