понедельник, октября 16, 2006

Об асинхронности в asp.net 2.0

Чуть больше года назад мы выпустили первую версию нашего продукта для сектора госуправления. По итогам опытной эксплуатации была добавлена функция, позволившая сэкономить пользователями сотни и даже, может быть, тысячи часов рабочего времени. Некоторые страницы содержали (и продолжают содержать) списки, состоящие из тысяч записей, с тенденцией к постоянному расширению. Загрузить такой список через web и тем более - найти в нём что-то это задача для людей, которые уже сделали все распоряжения на случай своего самовозгорания на работе. Мне лично трудно возиться со списком, в котором есть хотя бы 20 элементов, а если больше, то эту и такую программу я стараюсь больше не открывать. Очевидно, что наши пользователи не более терпеливы, чем я. Поэтому было решено пойти по пути гугла, а ещё раньше - программы, разработанной неизвестными героями в дебрях ФНС, которая подсказывала варианты по мере набора пользователем слова. Набрал пользователь "у", ему предложили в качестве варианта страны: "УГАНДА, УКРАИНА...". В списке, реализованном как div поверх текста, пользователь стрелками или мышью выбирает то, что ему нужно. Хорошо, удобно, быстро. Отвечал за эту часть общей работы я и сделал так:
1. В HTML указал, что буду использовать webservice.htc
2. Написал свой htc, в котором определил клиентский HTML-элемент управления, который умеет цепляться к строке ввода, получать оттуда данные, отправлять их веб-сервису, получать от него отклик и выводить в таком типа списке элементов с подсветкой.
3. Само собой, надо написать WS
Проверили, всем понравилось.

Ситуация с развёртыванием этой инсталляции была неидеальной, высокая текучесть администраторских кадров на объекте внедрения, общая суматоха, в общем, в результате многочисленных несанкционированных изменений конфигурационного файла веб-сервис стал работать через раз. Мы, поддавшись на обещания одной компании, решили использовать механизм асинхронных вызовов из ASP.NET 2.0 В самом деле, если это такой революционный, радикальный и драматический прорыв, то почему бы не воспользоваться.

Надо сказать, что в эту болтовню я с некоторых пор не верю - очень мало есть компаний, если они вообще есть, в которых маркетологи и рекламисты понимают, что делают технические люди
Целью, которую мы преследуем, является исключение веб-сервиса из списка компонентов, так как в каждой точке расширения какой-нибудь гений администрирования всё сделает и настроит обязательно не так; функциональность WS передаётся обратно в ASPX. Переделка на самом деле проста.
1. В списке наследования страницы указывается ICallbackEventHandler
2. Реализуются 2 его метода, public void RaiseCallbackEvent(string eventArgument) и public string GetCallbackResult()
3. В первом методе выполняется разбор строки, сформированной в браузере, во втором браузеру асинхронно отдаётся ответ.

Сделать это было всё несложно и вообше - дело пяти минут, я дольше вспоминал, как получить поля из web-формы c использованием JavaScript: работа велась автоматически и бессознательно. Когда всё было сделано, я осмотрелся и память услужливо предложила свой вариант увиденного: 1998й год, лето. Я пишу на asp маленькую задачу с получением результата поиска билетов без перерисовки страницы у клиента. RSExecute, RSEnableRemoteScripting и прочее, кто понимает. Прошло 8 лет, даже 8 с половиной и ничего не изменилось, всё то же самое. Клиентские скрипты, серверные скрипты, один шлёт, другой слушает... Где радикальная новь?

Поэтому приходится признать, что в плане асинхронности 2.0 предлагает не больше, чем ASP 9 лет назад. Это не хорошо, и не плохо. Это - правда.

5 комментариев:

Анонимный комментирует...

ну а чего мы хотим... все веб-технологии - это HTML через HTTP. Ну как можно придумывать новое, если отображать и обрабатывать ты все равно будешь гребаный ДХТМЛ, а летать это (ВСЯКО!) будет исключительно формами (посмотри на реальзацию вьюстейтов) или внутри УРЛов (это уж совсем пиздец).
Ту же самую функциональность (я про динамические списки) в старом АСП можно сделать через iFrame с активным содержимым и клиентский JavaScript, причем структурированность кода, кажется, не очень и пострадает...
Почти не в тему, но: честно говоря, когда я впервые полез разбираться с htc, я не видел им применения - задачи, под которые htc заточены, решались "и так, по-старому". Все дело в том, что многим девелоперам, в тот момент мигрировавших с более красивых технологий, htc показались более красивыми. Мне, когда я разобрался, видимо, тоже, но сейчас я так смотрю и принципиальной разницы не наблюдаю.

Das Ich комментирует...

Судя по времени и оборотам речи - Александр Владимирович? :)

Я скажу, что мне нужно. Мне нужно всего лишь, чтобы перестали врать: "О! А! Новая! Революционная! Never seen before! Object model is dramatically improved!"

И ещё я хочу linker для .NET и шаблоны для компиляции только с подставленным типом, а не с болванкой. Видимо, я снова хочу C++

Анонимный комментирует...

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

Das Ich комментирует...

Посмотрев на процесс вызова удалённых скриптов поближе, я окончательно убедился, что внутри лежит тот же самый XmlHttpRequest, что и раньше, только глубже запрятан, и если специально не захотеть узнать, то и не узнаешь, что там. С XmlHttp я последний раз работал напрямую летом 2003го и тогда он уже несколько лет, как не был новинкой. Продолжая изучать, увидел что-то действительно интересное в 2.0. Асинхронные страницы. Изложу в ближайшее время.

Анонимный комментирует...
Этот комментарий был удален администратором блога.