Автор: Роман Панышев (irrona)


Удаленный запуск ASP

      При написании WEB-проекта для внутриведомственной сети (т.е. интранет-проекта) возникла насущная необходимость в выполнении скрипта, расположенного в ASP-странице таким образом, чтобы избежать повторной загрузки клиентской HTML-страницы с сервера.

      Проект писался с использованием IDE Microsoft Visual InterDev версии 6. В качестве WEB-сервера выступал Internet Information Server (IIS).

      Некоторое время разумеется ушло на поиск информации в Интернет и MSDN о том, каким же образом осуществить поставленную задачу. Необходимо отметить, что на сегодняшний день существует несколько технологий такого рода выполнения ASP страниц:

      Кроме этого в сети Интернет нашлось несколько решений, но все они использовали, предложенную Microsoft технологию использования Java-апплета.

      Всем хорош способ, предложенный разработчиками от Microsoft. И я настоятельно рекомендую им пользоваться. Но!!! В случае, если:

      При создании нового проекта в IDE Microsoft Visual InterDev версии 6, мастером автоматически создается папка _ScriptLibrary, в которую мастер помещает кучу различных файлов. Для удаленного запуска ASP используются RS.asp, RS.htm, RSPROXY.class. Кроме этого, в качестве бонуса, мастер помещает туда файл RSPROXY.java - исходный код, на основании которого при компиляции можно получить файл RSPROXY.class. Во как!!!

      Изучив принцип работы данного подхода, я понял, что RSPROXY.class - это Java-апплет, в котором выполняется вся работа по перенаправлению запросов от клиента серверной ASP и ответа от ASP обратно клиенту. В качестве клиента выступает любая HTML-страница. Промежуточным звеном между клиентом и Java-апплетом, является страница RS.htm, а между Java-апплетом и ASP-страницей - страница RS.asp. Вот как это выглядит на рисунке:

ASP Remote Execute picture1
рис.1 Взаимодействие компонентов удаленного запуска ASP-страниц. Способ, основанный на использовании Java-апплета.

      Для работы с апплетом, к клиентской странице необходимо подключить файл RS.htm. Для этого внутри тэга BODY документа помещаются два скриптовых блока вот таким образом:

<script language="JavaScript" src="_ScriptLibrary/rs.htm"></script>
<script language="JavaScript">RSEnableRemoteScripting("_ScriptLibrary");</script>

      И, затем, в блоке SCRIPT, пишем скрипт для выполнения метода RSExecute апплета, передавая ему в качестве аргументов название ASP-страницы, название метода, опеределенного на ASP-странице и, что необязательно, параметры для выполняемого метода:

<SCRIPT LANGUAGE=vbscript>
Function RunASP()
	ASPData = "test1.asp"
	ASPMethod = "myMethod"
	Set co = RSExecute(ASPData, ASPMethod)
	MsgBox co.return_value
End Function
</SCRIPT>

      После выполнения метода, объектная переменная co будет содержать результат выполнения.

      Затем в ASP-страницу, запускаемую удаленно, вписывается следующий код:

<%@ Language=VBScript %>
<% RSDispatch %>
<!--#INCLUDE FILE="_ScriptLibrary/rs.asp"-->

      Я не буду объяснять назначение данного заголовка, т.к. он довольно подробно описан в MSDN и на сайте Microsoft. Затем, ниже, используя JavaScript, можно писать определения методов для вызова удаленно, например так:

<SCRIPT RUNAT=SERVER LANGUAGE="JavaScript">
   var public_description = new myMethod();
   function myMethod()
   { 
      this.myFunction = Function( 'return myFuncHandler()' );
   }
</SCRIPT>

      А затем их реализацию, например вот так:

<SCRIPT RUNAT=SERVER LANGUAGE="VBScript">
Function myFuncHandler()
	myFuncHandler = "Результат удаленного запуска ASP-страницы с использованием апплета"
End Function
</SCRIPT>

      Вот, в принципе, и все.

      Если Вас устраивает подход, предложенный Microsoft, можете скачать архив с необходимыми для работами файлами и дальше не читать. Остальным же я покажу свой подход к решению данной задачи.

      Поскольку разрабатывался WEB-проект для использования в рамках организации, т.е. имелся физический доступ к любому компьютеру сети (необходим для установки компонента), а использование Java-апплета меня не устраивало по причине его тормознутости при загрузке клиентом, то нужно было, во-первых найти замену апплету. На эту роль лучше всего подошел COM-объект (т.н. ActiveX Dll), написанный на Visual Basic. В принципе его можно было написать на любом другом языке, но VB я владею лучше всего. Во-вторых, необходимо было также иметь файлы-посредники между клиентской страницей и COM-объектом и между COM-объектом и ASP-страницей. Для этого я выкинул все, на мой взгяд, лишнее из Microsoft-овских файлов-посредников и добавил код, необходимый для работы с COM-объектом. В результате получился более быстрый и компактный код для удаленной работы с ASP-страницами, единственное неудобство которого заключается в необходимости установки COM-объекта на каждый компьютер сети, которому необходим доступ к интранет-ресурсу. Но, я думаю, для небольших организаций это не является большой проблемой. Кроме этого, на всех компьютерах сети была установлена ОС MS Windows XP, а в качестве сервера можно использовать MS Server 2000 с установленным IIS версии 5, либо MS Server 2003 с IIS версии 6. Необходимые для использования файлы можно загрузить здесь. В архиве Вы найдете COM-объект iRemote.dll, который необходимо зарегистрировать на клиентской машине с помощью утилиты regsvr32.exe, а также файлы посредники iRS.htm и iRS.asp. Использование этих компонентов показано на рисунке ниже и аналогично использованию удаленного запуска ASP с использованием Java-апплета.

ASP Remote Execute picture2
рис.2 Взаимодействие компонентов удаленного запуска ASP-страниц. Способ, основанный на использовании COM-объекта.

      Перед использованием компонентов необходимо, во-первых зарегистрировать COM-объект на клиентской машине, во-вторых скопировать файлы-посредники в папку проекта, например в _ScriptLibrary. Далее, в клиентской HTML-странице в секцию BODY вписываем скриптовый блок, импортирующий посредника iRS.htm:

<script language="JavaScript" src="_ScriptLibrary/iRS.htm"></script>

      После этого в секции SCRIPT можно писать код для выполения метода ASP-страницы:

<SCRIPT LANGUAGE=vbscript>
Function GetSessionId()
	ASPData = "test2.asp"
	ASPMethod = "myMethod"
	co = RSExecute(ASPData, ASPMethod)
	MsgBox co
End Function
</SCRIPT>

      Заметьте, что переменная co, возвращающая результат работы метода, уже не является объектной. Если будете ее использовать как объектную переменную, обязательно получите ошибку. На этом с клиентской частью все. Теперь на серверной стороне, оформляем ASP-страницу. Для этого в файл test.asp запишем импорт посредника iRS.asp:

<%@ LANGUAGE=VBScript %>
<!--#INCLUDE FILE="_ScriptLibrary/iRS.asp"-->

      И, далее, вписываем скриптовый блок с параметром RUNAT=SERVER:

<SCRIPT RUNAT=SERVER LANGUAGE="VBScript">
Function myMethod()
	myMethod = "Результат удаленного запуска ASP-страницы с использованием COM-объекта"
End Function
</SCRIPT>

      Как Вы могли заметить, кода немного меньше по сравнению с методом, основанным на использовании Java-апплета.

      К тому же скорость работы моего метода выше за счет того, что использован бинарный COM-объект, быстрота загрузки которого браузером намного выше, чем Java-апплетов.

      Это все, чем я хотел поделиться с Вами в этой статье. Думаю многие найдут мой метод более привлекательным, при разработке собственных интранет-проектов, чем способ, предложенный Microsoft. Удачи :-))


© 2005 ironahot@idknet.com - при использовании статей просьба делать ссылку на автора