Веб-интерфейс для поддержки поставщиков VAP на веб-узле Microsoft Direct Access

 


 

 

 

 

 

 

 

 

                                     

 

 

 

 


Содержание

 

Предлагаемое решение............................................................................................................................... 5

Обработка сообщений........................................................................................................................................ 5

Структура файлов и каталогов...................................................................................................................... 5

Пользовательский интерфейс.......................................................................................................................... 8

Безопасность........................................................................................................................................................... 9

Реализация............................................................................................................................................................ 10

Составление сообщения................................................................................................................................... 10

Общие папки........................................................................................................................................................ 12

Служба событий............................................................................................................................................... 12

Интерфейс поиска (Microsoft Index Server и RDO)................................................................................... 13

Веб-отображение.............................................................................................................................................. 15

Регистрация ошибок......................................................................................................................................... 17

Физическая архитектура................................................................................................................................. 18

Аппаратные компоненты сервера................................................................................................................ 20

Программные компоненты сервера.............................................................................................................. 20

Настройка серверов............................................................................................................................................ 22

Настройка сервера UDS.................................................................................................................................. 23

Настройка сервера Microsoft Exchange Server 5.5 для R&R и UDS..................................................... 23

Настройка веб-серверов.................................................................................................................................. 26

Регулировка быстродействия и масштабируемость.......................................................................... 26

Использованные средства и технологии................................................................................................. 27

График работы....................................................................................................................................................... 28

Планы на будущее......................................................................................................................................... 29

Полученный опыт......................................................................................................................................... 31

Приложение А. Примеры программного кода....................................................................... 33

 



 

Поддержка поставщиков VAP на веб-узле Direct Access

 

Direct Access – это созданный корпорацией Майкрософт веб-узел для независимых поставщиков технологий. На него по адресу www.microsoft.com/directaccess ежедневно приходит несколько сот тысяч вопросов. В данном информационном документе описывается, как на веб‑узле Direct Access применяется управление знаниями для улучшения обслуживания пользователей.

Корпорация Майкрософт поддерживает своих покупателей и партнеров посредством веб-узла (www.microsoft.com), используя снабженные средствами поиска хранилища данных и специально предназначенную для этого большую группу персонала – Microsoft Support. Обслуживание независимых поставщиков технологий – это ключевая задача системы поддержки, поскольку они, как создатели новых решений, являются наиболее грамотной частью аудитории и, отвечая на их вопросы, можно определить, какие вопросы будут наиболее важными для более широких групп пользователей.

В качестве первого шага в улучшении обслуживания пользователей к веб‑узлу Direct Access было решено добавить новые функции работы с группами новостей, чтобы дать возможность пользователю целиком проследить ход обмена вопросами и ответами по той или иной теме и связаться по электронной почте с другими участниками.

Разработчики фирмы ECMS (Enterprise Communications and Messaging Solutions), Колумбия, штат Южная Каролина, занимались созданием на веб-узле Microsoft Direct Access интерфейса, предназначенного для работы в Интернете и поддержки групп новостей, построенного с использованием сервера Microsoft Exchange Server 5.5. Это решение, реализованное за два месяца, заменило традиционные средства работы с группами новостей, работавшие на базе нескольких серверов UNIX.


Применение управления знаниями

 

Содержащие большой объем данных вопросы и ответы по каждой теме образуют ключевую базу знаний не только для независимых поставщиков технологий корпорации Майкрософт, но и для специалистов по поддержке узла Direct Access, которым приходится концентрировать свои усилия на службе поддержки и искать наилучшие способы работы.

Добавление к веб-узлу функций работы с HTML-файлами расширяет доступ к базе знаний благодаря общепринятым и удобным в работе технологиям на основе обозревателей, а также благодаря возможности поиска в массе материала – раньше поиск по всем группам новостей был невозможен.

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

Специалисты Direct Access получают новое средство для определения и отслеживания потоков обсуждений, представляющих критический интерес для пользователей продукции корпорации Майкрософт и для независимых поставщиков технологий. Такое наглядное представление наиболее важных знаний позволяет не только осуществлять направленную поддержку пользователей, но также быстро на основе базы знаний определять наилучшие способы работы. На веб-узле Direct Access планируется разработка средств поддержки и улучшения качества базы знаний, – например, благодаря усовершенствованию процесса автоматического индексирования и поиску способов оценки качества документов, основанных не только на сроке их жизни.
Предлагаемое решение

Приложение Direct Access – это группа новостей на базе Веба. В нем используются общие папки сервера Microsoft Exchange Server 5.5, доступ к которым осуществляется либо из Веба, либо из клиента новостей, использующего протокол NNTP (Network News Transfer Protocol). Протокол NNTP широко применяется для обмена статьями новостей на серверах UNIX и других серверах.

В качестве технологии для создания, передачи и обработки веб-сообщений была выбрана модель Collaboration Data Objects 2.0 (CDO). Модель CDO представляет собой набор сценарных объектов модели COM, предназначенных для клиентских и серверных приложений. Технология CDO не только основана на стандартах Интернета, но также предоставляет возможность обрабатывать события протокола и поддерживать протокол NNTP. События протокола позволяют разработчику строить приложения, которые обрабатывают входящую и исходящую почту. Поддержка протокола NNTP дает разработчику возможность помещать и обрабатывать сообщения новостей USENET.

Обработка сообщений

При помещении сообщения пользователь должен заполнить определенные поля, например, с указанием темы и автора. Сообщения новостей от пользователей сохраняются и помещаются на сервер Microsoft Exchange Server 5.5 при помощи сценария обработки событий протокола CDO. Этот сценарий обрабатывает входящие сообщения, добавляя к ним поля и создавая файлы ключевых слов и указателей, которые впоследствии будут использоваться сервером индексирования Microsoft Index Server при поиске по запросам.

Веб-серверы, на которых работает система Microsoft Internet Information Server, строят запросы для поиска по HTML-формам, заполняемым пользователями, и затем посылают запрос серверу индексирования Microsoft Index Server с помощью подключения RDO (Remote Data Object). Можно вести поиск по теме-заглавию, автору, дате и тексту сообщения.

Для каждой темы новостей на сервере Microsoft Exchange Server 5.5 есть отдельная общая папка с собственным сеансом чтения в виде объекта CDO, который используется для представления содержимого папки в формате HTML. Пользователи, обладающие клиентом обозревателем новостей, могут просматривать группы новостей непосредственно в папках сервера Microsoft Exchange Server 5.5.

Структура файлов и каталогов

Приложение ASP, управляющее веб-узлом Direct Access, обращается к каталогу индексов указателей сообщений на сервере R&R. Разработчики фирмы ECMS рассмотрели два способа организации каталога указателей. Первый вариант – это текстовый каталог с именами файлов, структурированными по перепискам, и уникальный индекс. В этом случае уменьшается величина и возрастает быстродействие файлов указателей, но на страницах ASP требуется выполнять подбор потоков переписок при помощи разбора больших каталогов.

Для второго варианта требуется дерево каталога, аналогичное потоку переписки, с более мелкими наборами файлов, имеющих уникальные имена  в соответствующих каталогах. Этот процесс требует с дополнительную обработку, связанную с представлением в формате HTML. В фирме ECMS было выработано компромиссное решение, при котором все сообщения для каждой группы новостей содержатся в уникальном каталоге.

Краткое описание архитектуры приложения показано на рисунке ниже.


Архитектура приложения

Серверы

Веб-узел Direct Access размещен на четырех серверах: два веб-сервера, сервер R&R (Replication and Rendering Server), на котором работает служба индексов сообщений, и сервер UDS (User Data Server), на котором содержатся копии папок сообщений, доступные только для чтения. Как NNTP-обозреватель новостей, так и веб-обозреватель могут обращаться к сообщениям на сервере UDS, при этом время отклика вполне приемлемо для модемов со скоростью 14,4 и 28,8 бод.

Безопасность

Меры безопасности соответствуют открытому форуму. Доступом к папкам управляют службы протокола NNTP в составе сервера Microsoft Exchange Server 5.5. Безопасностью управляет та же доменная структура Microsoft Windows NT®, которая используется приложением. Для хранения учетных записей пользователей сервера Microsoft Exchange Server организован домен Microsoft Windows NT. Первоначально на этом домене было только три учетных записи – для приложения, для административного доступа и веб-узле www.microsoft.com позволяет проверять подлинность сеансов пользователей, и все входы из Интернета на сервер Microsoft Exchange Server 5.5 являются анонимными.


Пользовательский интерфейс

В пользовательском интерфейсе используются технология ASP и сервер Microsoft Internet Information Server. Не зарегистрированному ранее пользователю предлагается зарегистрироваться и выбрать версию HTML группы новостей.

 

Сервер Microsoft Index Server

Поскольку указатели MHR имеют формат HTML, сервер Microsoft Index Server (работающий на сервере R&R) для операций поиска и выдачи данных использует индексы. Обязательно индексируются тема, автор, дата и код сообщения. Для поддержки более серьезного поиска можно извлекать ключевые слова.

Поиск сообщений

Когда сеанс ASP получает указание на конкретное сообщение, фактическое извлечение сообщения из папки осуществляется CDO-вызовом процедуры GetMessage. После этого ASP-приложение представляет пользовательский интерфейс этого сообщения.

 

 

Безопасность

В группах новостей есть два уровня безопасности – процедура регистрации пользователей на веб-узле www.microsoft.com и проверка подлинности в системе Microsoft Exchange Server 5.5 – Microsoft Windows NT. Поскольку данное приложение функционирует как открытый форум, меры безопасности направлены на сбор сведений о пользователях, а не на защиту важных данных. Фактически все входы являются анонимными, хотя административная учетная запись предоставляет доступ только непосредственно через сервер Microsoft Exchange Server и клиент Microsoft Outlook® 98.

Когда пользователь пытается инициировать сеанс, при регистрации на узле www.microsoft.com выполняются следующие две проверки.

1.     С авторизованного ли URL-адреса пришел запрос?

2.     Зарегистрирован ли уже этот пользователь?

Если оба условия выполняются, организуется новый сеанс работы с приложением.

После проверки подлинности сеанса учетные данные пользователя передаются процессу проверки подлинности System Session. Этот процесс устанавливает разрешения, позволяющие сеансам ASP получать доступ к общим папкам сервера Microsoft Exchange Server.

Сеанс ASP действует как обычный пользователь, разрешения для которого хранятся на сервере USD. Этот сеанс предоставляет все сообщения папок, независимо от сеанса пользователя. Единый сеанс CDO помещает все запросы.

Для каждой общей папки (группы новостей) поддерживается свой сеанс CDO для обработки запросов на чтение. Все фактически помещаемые статьи обрабатываются сеансом проверки подлинности, организованным на странице ASP. Поскольку доступ сеанса к папкам анонимен, NNTP-клиенты также могут взаимодействовать с системой.

Существуют планы перехода к схеме проверки подлинности конкретного пользователя. Разработчики фирмы ECMS реализовали схему разделения проверки подлинности сеансов, которая сделает это возможным.

 

 

 


Реализация

Пользователи  получают доступ к папкам сервера Microsoft Exchange Server с помощью обозревателей Интернета. В пользовательском интерфейсе применяются страницы ASP/HTML загруженные объектом CDO из общих папок сервера Microsoft Exchange Server 5.5, содержащих NNTP-сообщения.

Приложение имеет пять описанных ниже компонентов.

Составление сообщения.

Общие папки.

Интерфейс поиска – сервер Microsoft Index Server и объекты Microsoft ActiveX® Data Objects (ADO).

Веб-отображение.

Регистрация ошибок.

Составление сообщения

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

Окно нового сообщения

Новому сообщению назначается уникальный идентификационный код – Conversation Index (индекс переписки). Код Conversation Index для ответного сообщения будет тот же, что и для исходного. Ниже приведен пример сценария составления сообщения.

Пример сценария составления сообщения

Sub ComposeMessage(strState)

      Dim aSessionWrite

      Dim FolderID, strFolder, msgID

‘ Получить сеанс CDO

      aSessionWrite = Application("aobjCdoSessionWrite")

      Set objAMSession = aSessionWrite(1)

‘ Проверить, выполняется ответ или составление нового сообщения

      If (Request.Form("Submitted") = "TRUE" AND _

               Request.Form("QuoteOriginal") = "FALSE") OR _

               (Request.Form("Submitted") = "TRUE" AND strState = "new") Then

            If strState = "reply" Then

                  msgID = Session("msgID")

                  Set objMessage = objAMSession.GetMessage(msgID,NULL)

                  strFolder = objMessage.FolderID

                  Set objFolder = objAMSession.GetFolder(strFolder,NULL)

            Else

                  FolderID = Session("FolderID")

                  Set objFolder = objAMSession.GetFolder(FolderID)

            End If

‘ Создать сообщение и заполнить его соответствующие поля

            Set objNewMessage = objFolder.Messages.Add

            objNewMessage.Type= "IPM.POST"

            objNewMessage.Subject = Request.Form("Subject")

            objNewMessage.Text = Request.Form("Compbody")

            If strState = "reply" Then

                  objNewMessage.ConversationIndex = _

                     objAMSession.CreateConversationIndex(objMessage.ConversationIndex)

                  objNewMessage.ConversationTopic = objMessage.ConversationTopic

            Else

                  objNewMessage.ConversationIndex = _

                     objAMSession.CreateConversationIndex

                  objNewMessage.ConversationTopic = Request.Form("Subject")

            End If

            objNewMessage.Categories = ParseKeywords(Request.Form("KeyWords"))

            Set itmMessTemp = objAMSession.Outbox.Messages.Add

            Set objRecips = itmMessTemp.Recipients

            Set objRecip = objRecips.Add(DecodeString(Session("NameAuthor")), _

               "SMTP:" & DecodeString(Session("emailAddress")), 1)

            objRecip.Resolve

            objNewMessage.Sender = objRecip.AddressEntry

            objNewMessage.Importance = 1

            objNewMessage.TimeReceived = Time

            objNewMessage.TimeSent = Time

            objNewMessage.Submitted = True

            objNewMessage.Unread = True

            objNewMessage.Sent = True   

            objNewMessage.Update

      ElseIf strState = "reply" Then

      msgID = Session("msgID")

            Set objMessage = objAMSession.GetMessage(msgID)

      End If

End Sub

Сообщение сохраняется и помещается на сервер R&R при помощи объекта CDO. После обработки этого сообщения службой событий сервера Microsoft Exchange Server 5.5 его можно будет просматривать с использованием веб-интерфейса.

Общие папки

На сервере Microsoft Exchange Server общие папки создаются в папке Internet Newsgroups в соответствии с входящими/исходящими подписками на группы новостей. Сообщения из групп новостей передаются на сервер Microsoft Exchange Server. Сценарий событий Microsoft Exchange Server 5.5 обрабатывает входящие сообщения, присваивая каждому сообщению соответствующие поля (Depth, Responses, Conversation Topic), разбирая ключевые слова (которые будут использоваться сервером Microsoft Index Server для поиска) и создавая файлы указателей для этого сервера.

Папки сервера Microsoft Exchange Server

Служба событий

Служба событий сервера Microsoft Exchange Server 5.5 запускает сценарий агента в случае одного из следующих событий.

Помещено новое сообщение. Событие OnMessageCreate получает текущее сообщение и передает его в качестве объекта программе MHR (Message HTML Renderer). Если программа MHR вернет ошибку, эта ошибка будет зарегистрирована в журнале действий системы.

Сообщение удалено.

Сообщение обновлено или изменено. Событие OnMessageCreate получает текущее сообщение и передает его в качестве объекта программе MHR. Если программа MHR вернет ошибку, эта ошибка будет зарегистрирована в журнале действий системы.

Запланированное событие (например, каждые два часа).

Сценарий агента установлен на вкладке Agents страницы свойств каждой папки сервера Microsoft Exchange Server. Он создает запись указателя индекса для сообщения.

При помещении нового сообщения сценарий ищет в тексте сообщения все слова, которые могут быть каталогизированы в качестве ключевых. Применяемый в настоящее время метод сохраняет десять самых длинных слов в качестве ключевых наряду с полями темы, автора и другими полями. Эти сведения хранятся в файле указателя, который используется сервером Microsoft Index Server для создания возможностей поиска в группе новостей.

Кроме того, сценарий также меняет свойства сообщения, чтобы оно имело должный формат при отображении с помощью веб-интерфейса.

Служба событий является однопотоковым ASP-модулем, обрабатывающим события сообщений по одному. Это может вызвать значительные задержки при необходимости обработки большого количества объектов. Рассматриваются альтернативные методы, использующие в службе событий "триггерную логику", которая запускает другую цепочку событий (возможно, на сервере транзакций, или в базе данных и в объекте COM), которая осуществляет более продолжительную и интенсивную обработку.

Служба событий запускается тем же событием сервера Microsoft Exchange Server, которое вызывает репликацию данных на сервер UDS. Это гарантирует, что репликация сообщения и индексация его указателя будут выполнены почти одновременно. Отредактированные и представленные по интерфейсу NNTP сообщения принимаются асинхронно, когда они реплицируются на сервер R&R.

Интерфейс поиска (Microsoft Index Server и RDO)

Разработчики фирмы ECMS используют возможности поиска, имеющиеся на сервере Microsoft Index Server. Когда сценарий службы событий сервера Microsoft Exchange Server обрабатывает сообщение, он выделяет из текста сообщения ключевые слова и записывает отправителя, тему, дату и код сообщения.

Файл указателя сообщения получает имя согласно идентификационному коду Conversation Index сообщения. Каждый элемент данных содержится в этом файле вместе с префиксом (SUBJ – тема, AUTH – автор, KEYD – ключевое слово и MSID – код сообщения). Сервер Microsoft Index Server следит за файлами указателей ключевых слов.

Ниже приведены примеры файлов указателей ключевых слов.

Пример файла указателя ключевых слов

Пример 1

SUBJPointer File Creation Script

AUTHPost Master

TIME1/11/99 11:21 AM

LEVL0

SUBD0

CNVS01BE3D7E627DC354286CA96511D28F230060B0CE3927

MSID000000001A447390AA6611CD9BC800AA002FC45A0900F29533C6BA57D211B75700A0C9E551010000000A21FD000087F0274128ABD211B77900A0C9E55101000000005D570000

MDEL87F0274128ABD211B77900A0C9E55101000000005D57

AUTHPost

AUTHMaster

SUBJCreation

KEYDCreation

SUBJPointer

KEYDPointer

SUBJScript

KEYDScript

SUBJFile

KEYDFile

KEYDRunAt=Server

KEYDLanguage=VBScript>

KEYD--------------------------------------------------------------

KEYDDESCRIPTION:

KEYDCONST_RootDirectoryName

KEYDCONST_WEBRootURL

KEYDcdoSession

KEYDobjFileSystem

KEYDcdoOutBox

KEYDfldrFolder

KEYDfollowing

 

Пример 2

SUBJTest

AUTHPost Master

TIME1/14/99 1:38 PM

LEVL0

SUBD0

CNVS01BE3FED458BF2625395ABDF11D28F270060B0CE3927

MSID000000001A447390AA6611CD9BC800AA002FC45A0900F29533C6BA57D211B75700A0C9E551010000000A21FD000087F0274128ABD211B77900A0C9E55101000000005D580000

MDEL87F0274128ABD211B77900A0C9E55101000000005D58

AUTHPost

AUTHMaster

SUBJTestKEYDTest

Подключение RDO (Remote Data Object) удаленным образом запрашивает сервер Microsoft Index Server. В результирующем наборе данных показываются сообщения, удовлетворяющие критериям поиска. Ниже показан пример сценария поиска.

Интерфейс поиска (Сервер Microsoft Index Server и объекты RDO)

Sub RunQuery

      ReDim names(0)

‘ Начало построения строки запроса к серверу Microsoft Index Server

      If Len(Request.QueryString("strKeywords")) > 0 Then

            strKeywords = "KEYD" & Replace(Request.QueryString("strKeywords"), " ", _

               " AND " & "KEYD")

            If Len(Request.QueryString("strAuthor")) > 0 OR _

               Len(Request.QueryString("strSubject")) > 0 Then

                  strKeywords = strKeywords & " AND "

            End If

      End If

      If Len(Request.QueryString("strAuthor")) > 0 Then

            strAuthor = "AUTH" & Replace(Request.QueryString("strAuthor"), " ", _

   " AND " & "AUTH")

            If Len(Request.QueryString("strSubject")) > 0 Then

            strAuthor = strAuthor & " AND "

            End If

      End If

      If Len(Request.QueryString("strSubject")) > 0 Then

            strSubject = "SUBJ" & Replace(Request.QueryString("strSubject"), " ", _

               " AND " & "SUBJ")

      End If

      strSearchString = strKeywords & strAuthor & strSubject

      strSearchString = Replace(strSearchString, "'", "")

      strSearchString = "where CONTAINS('" & strSearchString & "')>0"

      If Len(strKeywords) = 0 AND Len(strAuthor) = 0 AND Len(strSubject) = 0 Then

            strSearchString = ""

      End If

      Set rdsDataSpace = CreateObject("RDS.DataSpace")

‘ Открыть подключение к серверу Microsoft Index Server и выполнить запрос

      Set rdsDataFactory = rdsDataSpace.CreateObject("RDSServer.DataFactory","http://" & _

               Application("SERVER_Index"))

      strConnection = "provider=msidxs;data source=WEB"

      sCommand = "Select Path from SCOPE('""\""') " & strSearchString

      Set rdsMSIDXS = rdsDataFactory.Query(strConnection,sCommand)

      count = 0

‘ Просмотреть результаты и добавить их к массиву сообщений

      Do While NOT rdsMSIDXS.EOF

            If InStr(LCase(rdsMSIDXS.Fields(0)), _

               LCase(Session("masterfolder"))) > 0 Then

                  If Len(Mid(rdsMSIDXS.Fields(0), InStr(rdsMSIDXS.Fields(0), _

                     "ptr_"))) > 17 Then

                        count = count + 1

                        ReDim preserve names(count)

                        names(count) = rdsMSIDXS.Fields(0)

                  End If

            End If

            rdsMSIDXS.MoveNext

      Loop

      Session("aMsgArray") = names

End Sub

Веб-отображение

Файл global.asa определяет переменную-массив приложения для хранения отдельного сеанса чтения CDO для каждой общей папки Microsoft Exchange Server на узле. Этот файл также открывает сеанс для записи и для отчета об ошибках. Меню списка папок строится проходом по общим папкам сервера Microsoft Exchange Server, разбора их имен в массив для составления двух главных групп и отображения имен индивидуальных групп новостей. Номер сеанса папки присваивается согласно ее размещению в этом массиве.

Когда сеанс пользователя получает доступ к папке, сеанс, назначенный этой папке, читается из строки запроса (переданной из файла nav.asp) и используется для отображения папки в формате HTML.

Заголовки сообщений корневого уровня выводятся путем входа в назначенный папке сеанс и фильтрации сообщений по дополнительному полю «Depth» (глубина), установленному сценарием событий. Поле Depth хранит значение глубины конкретного сообщения в переписке.

Сообщения корневого уровня имеют глубину «0» и отфильтровываются в набор сообщений, коды которых хранятся в некотором массиве. Этот массив просматривается для отображения заголовков. После отображения заголовков просматривается еще одно дополнительное поле с именем «Responses» (отклики). Если поле «Responses» содержит значение «1», это значит, что на текущее сообщение есть отклики, и перед его заголовком выводится значок «плюс». Если значение поля «Responses» равно «0», выводится значок сообщения.

Если пользователь щелкнет значок «плюс», поток переписки разворачивается на один уровень. Это расширение выполняется за счет фильтрации набора сообщений в папке с увеличением на 1 глубины сообщений и «добавления» значения поля Conversation Topic. Коды отфильтрованных сообщений добавляются в массив на соответствующие места, и значок «плюс» перед сообщением сменяется значком «минус». Чтобы сократить данный поток переписки, пользователь щелкает значок «минус».

Когда пользователь щелкает тему, приложение вызывает сеанс CDO, чтобы получить данные о сообщении, открывает новое окно и выводит в нем тему, дату отправления и текст сообщения, а также отображает кнопки «next» (следующее), «previous» (предыдущее) и «reply» (ответить).


Пользовательский интерфейс с развернутым потоком сообщений

 

Регистрация ошибок

Разработчики фирмы ECMS создали на сервере Microsoft Exchange Server общую папку с названием «System Activity Log» (Регистрация действий системы) для хранения ошибок страниц ASP и сценариев обработки событий. На всех страницах существует процедура под названием LogActivity, которая посылает сообщение в папку System Activity Log каждый раз, когда происходит ошибка. Эта процедура в сочетании с процедурой «On Error Resume Next» позволяет регистрировать ошибки без нарушения работы веб-интерфейса. Ниже приведен пример подпрограммы LogActivity, вызываемой при возникновении ошибки.

Sub LogActivity (LogType, Message)

      Dim cdoLogItem, cdoLogAddress, cdoOutBox, objOutBox

      Dim objCdoSessionError

      On Error Resume Next

‘ Открыть сеанс CDO для обработки ошибки

      objCdoSessionError = Application( "objCdoSessionError" )

      Set objOutBox = objCdoSessionError(0)

      Set cdoOutBox = objOutBox.OutBox   

‘ Добавить новый элемент

      Set cdoLogItem = cdoOutBox.Messages.Add

      cdoLogItem.Type = "IPM.Note"

      cdoLogItem.Fields.Add "Log Entry Type",8,"ASP-" & LogType

‘  Переменная сеанса(Session(“Proc”)), устанавливаемая в каждой процедуре

‘  и содержащая имя вызванной здесь процедуры.

      cdoLogItem.Text = "Procedure: " & Session("Proc") & vbCrLf & Message

      Set cdoLogAddress = cdoLogItem.Recipients.Add

      cdoLogAddress.Name = "System Activity Log"

      cdoLogItem.Recipients.Resolve

      cdoLogItem.Send(False)

      Set cdoLogItem = Nothing

      Set cdoLogAddress = Nothing

      Set cdoOutBox = Nothing

      Set objOutBox = Nothing

End Sub

Физическая архитектура

Веб-узел Direct Access расположен на четырех серверах – персональных компьютерах, заменивших прежнюю конфигурацию UNIX. Это следующие четыре сервера.

Один сервер R&R (Replication and Rendering Server), работающий как концентратор для репликаций между внутренними группами новостей Microsoft News Groups. Индексирование сообщений HTML происходит на сервере R&R, который реплицирует их содержимое на сервер UDS.

Один сервер UDS (User Data Server), содержащий доступные только для чтения копии общих папок сервера Microsoft Exchange Server, к которым можно обратиться или из Интернета, или при помощи NNTP-клиента обозревателя новостей.

Два веб-сервера, на которых работает система Microsoft Internet Information Server.

Сервер R&R обеспечивает службы для работы с данными и управления ими, а сервер UDS хранит папки, просматриваемые в пользовательском интерфейсе. Благодаря репликации содержимого сообщений между серверами, вся обработка сообщений происходит на одном компьютере (на сервере R&R), а весь доступ к сообщениям – на другом (на сервере UDS). Это увеличивает устойчивость и быстродействие всей системы.


Физическая архитектура

MOSWEST

 

Аппаратные компоненты сервера

Тип сервера

Процессоры

Память

Жесткий диск

Серверы Exchange Server

 

R&R - CPITGMSGV01

и

UDS - CPITGMSGV02

 

4 x P6 200 МГц

512 МБ

C: 2 ГБ (2 диска по 9,1 ГБ), дисковый массив Raid 1

D: 44 ГБ (6 дисков по 9,1 ГБ), дисковый массив Raid 5

E: 6,6 ГБ (те же физические диски, что и C:)

 

Веб-серверы

VAP.MICROSOFT.COM

 

CPMSFTWBV01

и

CPMSFTWBV02

 

2 x Compaq Proliant 5500/5500R,

4 x Pentium Pro 200 МГц

384 МБ

Compaq Smart-2DH Array Controller, PCI, кэш 16 МБ

Compaq 4,3 ГБ Pluggable Wide-Ultra SCSI-3, жесткий диск 10000 об/мин, 1.0""

Compaq 9,1 ГБ Pluggable Wide-Ultra SCSI-3, жесткий диск 10000 об/мин, 1.0""

Compaq Rack-Mountable ProLiant Storage System, Model U1 (4U)

Кабель Compaq CPU-To-Switch Cable (От ЦП к коммутатору), длина 2,74 м.

 

 

 

 

Программные компоненты сервера

Сервер

Программные компоненты

Сервер R&R (CPITGMSG01)

Windows NT 4.0, пакет обновления 3, соответствующие обновления.

Сервер Microsoft Exchange Server 5.5, служба событий Event Service севера Microsoft Exchange Server, пакет обновления 1 для Microsoft Exchange Server 5.5.

Сервер Microsoft Internet Information Server 4.0 с сервером Microsoft Index Server.

ADO 2.0 (в том числе службы удаленного доступа к данным).

Сервер UDS (CPITGMSG02)

Microsoft Windows NT 4.0, пакет обновления 3, соответствующие обновления.

Сервер Microsoft Exchange Server 5.5, пакет обновления 1.

Веб-серверы (VAP.MICROSOFT.COM)

Microsoft Windows NT 4.0, , пакет обновления 3, соответствующие обновления.

Сервер Microsoft Exchange Server 5.5 Outlook Web Access (только OWA).

Сервер Microsoft Exchange Server 5.5, пакет обновления 1.

Сервер Microsoft Internet Information Server 4.0 с сервером Microsoft Index Server.

ADO 2.0 (для включения всех служб удаленного доступа к данным).

Примененные исправления

 

[Q147222]:

[NT:157613]: tcpip.sys

NT:11696]: oleaut32.dll

[NT:92480]: user32.dll win32k.sys

[NT:154943]: rpcltccm.dll

[NT:116920]: ndiswan.sys

[NT:89704]: lsasrv.dll

[NT:150946]: rpcrt4.dll rpclts8.dll rpclts1.dll rpcltscm.dll

[NT:104073]: wsock32.dll rnr20.dll mswsock.dll

[NT:87607]: wshtcpip.dll

[NT:134386]: srv.sys

[NT:103203]: netbt.sys

 [NT:85859]: winspool.DRV

[NT:132956]: mup.sys

[IISQFE:651]: cpacc

[NT:85261]: ntsd.exe imagehlp.dll cdb.exe

[NT:131480]: rdr.sys

[NT:165462]: schannel.dll

[NT:81658]: security.dll ntlmssps.dll

[NT:127355]: kdextx86.dll kdextalp.dll i386kd.exe alphakd.exe

[NT:160346]: advapi32.dll winlogon.exe

[NT:75074]: ntfs.sys

[NT:127084]: ntoskrnl.exe

[NT:167645]: ntdll.dll

[NT:57017]: eventlog.dll

[NT:121257]: afd.sys

[NT:119953]: ole32.dll rpcss.exe

Службы, одновременно работающие на веб-сервере

В следующей таблице приведено состояние одновременно работающих на одном из вебсерверов служб.

 

[Работает] Alerter

[Остановлена] Remote Procedure Call (RPC) Locator

[Работает] Messenger

[Остановлена] ClipBook Server

[Работает] Schedule

[Остановлена] Network DDE

[Остановлена] Insight Web Agent

[Работает] SNMP

[Работает] Net Logon

[Работает] SeNTry EKG

[Остановлена] Spooler

[Работает] NT LM Security Support Provider

[Остановлена] IIS Admin Service

[Остановлена] Telephony Service

[Работает] Plug and Play

[Работает] Workstation

[Остановлена] World Wide Web Publishing Service

[Остановлена] Directory Replicator

[Работает] TCP/IP NetBIOS Helper

[Работает] Computer Browser

[Работает] Remote Procedure Call (RPC) Service

[Работает] MSDTC

[Работает] Insight Agents

[Работает] Sentry Alert Sender (SASS)

[Остановлена] Network DDE DSDM

[Остановлена] DHCP Client

[Работает] SNMP Trap Service

[Остановлена] NTEC

[Работает] EventLog

[Работает] Compaq System Shutdown Service

[Остановлена] ParserService

[Работает] Server

[Остановлена] UPS

[Работает] Protected Storage

[Остановлена] License Logging Service

 

Настройка серверов

Конфигурация сервера R&R

Был установлен сервер Microsoft Index Server и создана папка (с именем ptrindex) для поддержки набора файлов, содержащих ключевые слова для поиска. После этого сервер Microsoft Index Server был настроен для слежения за этой папкой, и была введена запись реестра, сообщающая серверу Microsoft Index Server о расширении файлов, используемых SMK-файлами в этой новой папке. Ниже приведены инструкции.

Настройка папки

1.     Создать на сервере R&R папку с именем “ptrindex” в следующей иерархии папок:

 

Inetpub\wwwroot\ptrindex

2.     Создать папку для каждой группы обсуждений. Каждая папка должна иметь то же имя, что и группа обсуждений.

 

Inetpub\wwwroot\ptrindex\discussion group 1 … discussion group 2…

    

3.     Установить для папки свойство Shared (Общая), чтобы предоставить доступ группе Everyone (Все).

Создание раздела реестра

1.     С помощью программы regedit или regedt32 создать новый подраздел в разделе

 

HKEY_LOCAL_MACHINE\SOFTWARE\Classes

 

2.     Дать разделу имя <.SMK> и сделать значением по умолчанию (строковое значение) <txtfile>.

Создать каталог <Web> и запустить службу индексирования Index Service

1.     Запустить программу Microsoft Index Server Administrator.

2.     Остановить службу индексирования.

3.     Удалить все каталоги из <Microsoft Index Server on local machine>.

4.     Создать новый каталог с именем <WEB>.

5.     Добавить папку ptrindex в каталог <WEB>.

6.     Для каталога <WEB> задать следующие свойства.

·         На вкладке Web снять флажок Track Virtual Roots.

·         Снять флажок Track NNTP Roots.

·         На вкладке Generation снять флажок Deselect the Filter Files with unknown extensions.

·         Запустить службу индексирования.

Настройка сервера UDS

Сервер Microsoft Exchange Server

Для сервера UDS к стандартной установке сервера Microsoft Exchange Server 5.5 добавлены учетная запись WEBUser и журнал системных действий System Activity Log. Дополнительные сведения о настройке протокола NNTP и установке папок см. ниже в разделе «Настройка сервера Microsoft Exchange Server 5.5 для R&R и UDS».

Учетная запись WEBUser

На сервере UDS создана учетная запись сервера Microsoft Exchange Server с именем <WEBUser>. Основной учетной записью системы Microsoft Windows NT является запись EX_Anonymous, и разрешения этой записи устанавливаются для автора публикации.

Журнал действий системы

Все системные ошибки перехватываются и передаются в журнал действий системы на сервере UDS. Эту папку можно посмотреть при помощи клиента Microsoft Outlook 98 в общих папках.

Чтобы создать журнал действий системы, выполните следующие действия.

1.     Войдите на сервер UDS с помощью программы Microsoft Outlook 98, используя учетную запись WEBUser (см. раздел «Учетная запись WEBUser»).

2.     Создайте новую папку с именем <System Activity Log>.

3.     С помощью средства Microsoft Exchange Server Administrator выберите свойства для папки <System Activity Log> в папках Folders – Public. Выберите вкладку Advanced для просмотра дополнительных свойств и снимите флажок Hide в адресной книге.

Настройка сервера Microsoft Exchange Server 5.5 для R&R и UDS

Поскольку сервер Microsoft Exchange Server может служить и обозревателем новостей, и программой управления группой новостей, разработчики фирмы ECMS провели эксперименты с различными настройками, используемыми в зависимости от того, «извлекается» ли информация из других служб групп новостей. Основной задачей сервера R&R является поддержка сервера UDS в отношении индексирования и архивирования, а также управление будущими службами подписки. Ниже приведены замечания по настройке сервера Microsoft Exchange Server для различных конфигураций.

Настройка сервера Microsoft Exchange Server 5.5, когда используется протокол NNTP

1.     Остановить службу событий Event Service севера Microsoft Exchange Server на сервере R&R.

2.     Остановить все веб-службы.

3.     С помощью консоли администратора Microsoft Exchange Server Administration Console разрешить подключения для получения новостей и выбрать группы новостей для репликации на сервер R&R. При этом будут созданы папки Exchange на сервере R&R.

4.     Переименовать папки, применяя следующий синтаксис имен: <имя группы новостей> - <имя обсуждения>. Имена разделены последовательностью знаков <пробел><дефис><пробел>. Этот синтаксис используется интерфейсом API для декодирования имен группы и обсуждения.

5.     Эти папки должны быть помещены на сервер UDS.

6.     Установить для каждой папки репликацию только на сервер UDS.

7.     Применить сценарии агентов для каждой папки (см. «Установка агента папок Microsoft Exchange Server»).

8.     Запустить службу событий Microsoft Exchange Server на сервере R&R.

9.     Запустить все веб-службы.

Установка дополнительных групп новостей на сервере Microsoft Exchange Server 5.5

1.     Остановить службу событий Microsoft Exchange Server на сервере R&R.

2.     Остановить все веб-службы.

3.     С помощью консоли администратора Microsoft Exchange Server Administrator выбрать дополнительные группы новостей для репликации на сервер R&R.

4.     Переименовать папки, применяя следующий синтаксис имен: <имя группы новостей> - <имя обсуждения>. Имена разделены последовательностью знаков <пробел><дефис><пробел>.

5.     Поместить папки на сервер UDS.

6.     Установить для каждой папки репликацию только на сервер UDS.

7.     Применить сценарии агентов для каждой папки. (см. «Установка агента папок Microsoft Exchange Server»).

8.     Запустить службу событий Microsoft Exchange Server на сервере R&R.

9.     Запустить все веб-службы.

Настройка сервера Microsoft Exchange Server 5.5, когда протокол NNTP не используется

1.     Остановить службу событий Event Service севера Microsoft Exchange Server на сервере R&R.

2.     Остановить все веб-службы.

3.  С помощью клиента Microsoft Outlook 98 создать вложенные папки в папке Directaccess с иерархией: <Public folders><All Public folders><Internet Newsgroups><microsoft><private><Directaccess>

4.     Назвать папки, применяя следующий синтаксис имен: <имя группы новостей> - <имя обсуждения>. Имена разделены последовательностью знаков <пробел><дефис><пробел>. Этот синтаксис используется интерфейсом API для декодирования имен группы и обсуждения.

5.     Поместить эти папки на сервер UDS.

6.     Применить сценарии агентов для каждой папки (см. «Установка агента папок Microsoft Exchange Server»).

7.     Запустить службу событий Microsoft Exchange Server на сервере R&R.

8.     Запустить все веб-службы.

Настройка агента папок для сервера Microsoft Exchange Server 5.5

В каждой из папок групп обсуждений на сервере R&R устанавливается сценарий ms_agent1.txt, дающий возможность помещать в папку новые статьи. Это делается в соответствии со следующими инструкциями.

1.     Открыть приложение Microsoft Outlook 98 с учетной записью WEBUser (см. «Учетная запись WEBUser»).

2.     Разрешить работу сценариев сервера, последовательно выбрав из меню Microsoft Outlook 98 элементы Tools, Options, Other, Advanced Options…, Add in Manager.

3.     Установить флажок, разрешающий работу сценариев сервера.

4.     Правой кнопкой мыши щелкнуть папку группы новостей.

5.     Выбрать вкладку Agents.

6.     Выбрать New для применения сценария к группе новостей.

7.     В поле Agent Name ввести HTML.

8.     Установить A New Item is Posted in this Folder.

9.     Выбрать Edit script, и новый сценарий будет показан в окне текстового редактора Notepad.

10.  Удалить из сценария весь текст.

11.  Вставить текст из файла ms_agent2.txt.

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

13.  Сохранить файл и выйти из редактора.

14.  Задать выполнение сценария на сервере, выбранном для обработки событий.

15.  Выйти.

16.  Повторить для каждой папки групп новостей.


Настройка веб-серверов

Настройка серверов Microsoft Internet Information Server для двух веб-серверов идентична. Изменения и замечания представлены ниже.

Корневой каталог веб-узла

Для сервера Microsoft Internet Information Server веб-страницей по умолчанию установлена wwwroot, а файлом по умолчанию установлен default.asp в соответствии с требованиями корпорации Майкрософт. Время ожидания изменено на 900 с вместо принятого по умолчанию 300 с в связи с возможными задержками загрузки.

Изменение исходных файлов

В исходные веб-файлы внесены два изменения, чтобы страницы загружались должным образом.

1.      Файл Global.asa. Вверху файла global.asa file (приблизительно в строке 17) изменены две константы соответственно именам, используемым для серверов R&R и UDS.

 ‘*********************************************************************

‘*  DEFINE SERVER CONSTANTS

‘*  SERVER_Exchange should be changed to the name of your

‘*      User Data Server

‘*  SERVER_Index should be changed to the name of your R&R Server

‘*********************************************************************

Const SERVER_Exchange = “<имя сервера USD>”

Const SERVER_Index    = “<имя сервера R&R>”

2.     Файл Include/getemail.asp изменен, в нем указывается, какой сценарий MSData следует исполнять для поиска адресов электронной почты пользователей. Чтобы это выполнялось должным образом, этот сценарий должен быть установлен. Без этого приложение не будет работать.

 

Регулировка быстродействия и масштабируемость

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

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

Сколько пользователей может поддерживать сервер, работающий под управлением системы Microsoft Internet Information Server?

Сколько таких серверов может поддерживаться?

На каком уровне использования ресурсов серверов Microsoft Internet Information Server и Microsoft Exchange Server начинается недопустимое снижение быстродействия (с учетом времени отклика при различных уровнях нагрузки)?


Использованные средства и технологии

В приведенной ниже таблице показаны основные из использованных средств и технологий, а также основания для их выбора.

Средство или технология

Основания для выбора

Сервер Microsoft Exchange Server 5.5 со службой событий Event Service и пакетом обновлений 1

Устойчивость и масштабируемость при ожидаемом высоком объеме транзакций. Поддержка управления подпиской и группами новостей. Возможность работы с Вебом.

Сервер Microsoft Internet Information Server 4.0 с сервером Microsoft Index Server

На момент разработки это был единственный вариант реализации функций поиска на платформе Microsoft Windows NT. На будущее запланирован переход на сервер Site Server 3.0

Visual InterDev 6.0

Обеспечивает единое средство разработки с применением всех технологий, в том числе HTML, Microsoft Visual Basic® Script и JavaScript.

Adobe PhotoShop 5.0

Используется для создания оригинальных графических элементов пользовательского интерфейса.

Microsoft Visual Basic Script

Используется для создания страниц ASP, работающих на сервере.

CDO

Используется из-за языковой независимости и поддержки протокола NNTP.

ADO

Выбрано в связи с низкими накладными расходами. Модель RDO использует тонкий слой кода над уровнем ODBC и диспетчером драйвера, устанавливающим связь с базой данных.

JavaScript

Используется для создания дочерних окон и подключения функций сортировки на стороне клиента .

HTML 3.2

Поддерживается различными обозревателями.

Microsoft Windows NT 4.0, пакет обновлений, соответствующие обновления

 

 


График работы

Группа разработки фирмы ECMS, художник-дизайнер и три разработчика, полностью были заняты данным проектом в течение двух месяцев, проектируя и создавая основное приложение. Разработка пользовательского интерфейса требовала знания систем Visual Basic Script, Microsoft Internet Information Server, Microsoft Exchange Server, HTML и JavaScript. Разработка  серверных приложений требовала знания сервера Microsoft Exchange Server и веб-публикаций на основе Windows NT.

График работы над проектом

Фаза

Сроки

Реализованная возможность

Архитектура и структура

 

14-18 сентября 1998 года

Эскиз интерфейса

Графика верстка

Разработка HTML-кода

Подключение страниц ASP к серверу Microsoft Exchange Server

Разработка и пересмотр

 

10-15 октября 1998 года

Уточнение HTML-кода для поддержки всеми обозревателями

Разработка страниц ASP

Готовый интерфейс

Испытание подключений на скоростях 14,4 и 28,8 бод.

Устранение ошибок

Готовый рабочий прототип

Тестирование и исправление ошибок

25-29 октября 1998 года

 

Дата завершения

2 ноября 1998 года

 

Дата выпуска

5 ноября 1998 года

 


Планы на будущее

Службы подписки

Возможность подписки избавит пользователей от необходимости периодически проверять наличие новых сообщений в интересующих их областях. В профиле пользователя будет храниться его адрес электронной почты, полученный во время процедуры регистрации, а также все подписки, выбранные щелчком по кнопке «Subscribe to Thread» (Подписаться на поток). Чтобы отменить подписку на поток, пользователь просто нажимает кнопку User Services (Службы пользователя) и выбирает, какие подписки следует удалить.

Подписки реализуются открытием сеанса ADSI (Active Directory Services Interface) протокола LDAP (Lightweight Directory Access Protocol), работающим совместно с сервером Microsoft Exchange Server, который создает для пользователя внешний адрес получателя и добавляет этот адрес в созданный список рассылки потока переписки. Этот список будет применяться для рассылки обновления при поступлении каждого нового сообщения.

Поддержка гиперссылок и вложений

Веб- и FTP-адреса будут автоматически привязываться гиперссылкой к соответствующим адресам при чтении сообщения. Вложения загружаются в Интернет с помощью средства Microsoft Posting Acceptor. Далее для добавления этих загруженных файлов к соответствующему сообщению используется технология CDO.

Визуализация времени ожидания

При открытии групп новостей, имеющих несколько сот потоков сообщений, пользователи могут испытывать задержки. Эти задержки можно по ошибке принять за простои. Группа фирмы ECMS разрабатывает индикатор загрузки страницы Page Loading Meter – небольшое окно, содержащее страницу ASP со сценариями JavaScript и VB Script, показывающее ход загрузки страницы.

Старение сообщений

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

Возможности поиска

В настоящее время у пользователя есть возможность вести поиск в конкретной группе новостей, во всей основной группе или во всем приложении.

Многократные реализации

Формы Microsoft Outlook 98 используются повторно для создания средства «Master Configurator Record», позволяющего использовать один и тот же код в разных реализациях приложения на одной и той же физической инфраструктуре. Этот код читает информацию о настройке с сервера Microsoft Exchange Server и отображает соответствующие группы новостей на основе заранее определенных разрешений.


Полученный опыт

Сервер Microsoft Index Server

Разработчики фирмы ECMS установили, что сервер Microsoft Index Server целесообразно использовать как платформу для управления созданием индексов и запросами и что службу событий Event Service севера Microsoft Exchange Server лучше применять для запуска сценариев агентов, чем для обработки данных. Фирма считает, что фильтры CDO обеспечивают хорошее быстродействие. В планах на будущее рассматривается сервер Site Server 3.0.

Структура каталога файлов

Разработчики фирмы ECMS создали единый каталог для каждой группы сообщений, позволяющий вести поиск по группам сообщений. В соответствии с исходным планом системы можно было искать сообщения только в основных папках.

Преимущества модели RDO

Основное преимущество модели RDO состоит в том, что она использует малый объем памяти. Модель RDO использует тонкий слой кода над уровнем ODBC и диспетчер драйверов, который устанавливает связь с базой данных. Этот тонкий слой очень похож на модель DAO, но без тех ресурсов, которые требуются для модуля Jet на клиентском компьютере. В результате сильно уменьшается необходимый объем памяти и интенсивность подкачки программы с жесткого диска.

Масштабируемость модуля CDO

Модуль CDO – средство представления в формате HTML, первоначально распространявшийся с сервером Microsoft Exchange Server, был рассчитан на одновременное проведение только до 800 – 1000 одновременных сеансов. Поскольку к веб-узлу могут быть сотни тысяч обращений в день, фирма ECMS обратила внимание на «узкие места» (во времени и ресурсах оборудования), возникающие при переводе сообщений в формат HTML. В результате фирма ECMS решила модифицировать модуль CDO и заменить его архитектурой общего сеанса.

Поддержка вложений

Чтобы дать возможность вкладывать файлы в помещаемые сообщения, потребовались дополнительные усилия разработчиков, поскольку непосредственно технология ASP не поддерживает загрузку файлов. Фирма ECMS использовала Microsoft Posting Acceptor (MPA) – внешнюю библиотеку DLL, работающую с сервером Microsoft Internet Information Server. Эта библиотека принимает файлы, помещенные с помощью HTML-формы, и сохраняет их в общей папке на сервере UDS. Для чтения файлов, вложенных в сообщение, используется технология CDO.

Быстродействие

Разработчики фирмы ECMS увеличили фактическое быстродействие, уменьшив длину уникального кода сообщения в массиве хранения до 4-6 знаков вместо 144. Индексирование, помещение и поиск сообщений теперь занимают меньше времени.

Мониторинг

Разработчики фирмы ECMS создали папку Microsoft Exchange Server для регистрации отказов и ошибок, поскольку оказалось трудным передавать достаточный объем данных из сеансов ASP в журнал регистрации событий Microsoft Windows NT.

Подписки

Организация подписок вызвала определенные затруднения, поскольку модель CDO имеет ограниченный доступ к списку адресов Microsoft Exchange Server. Первоначальное решение для подписок предусматривало создание индивидуальных списков рассылок для потока каждой переписки, на который подписывается пользователь. Однако в технологии CDO можно создавать только личные – не глобальные – списки рассылки.

Чтобы решить эту проблему, разработчики фирмы ECMS использовали сочетание модели CDO и протокола ADSI/LDAP, поскольку у протокола LDAP есть прямой доступ к списку глобальных адресов. CDO передает протоколу LDAP сведения об именах списка рассылки, и этот протокол создает внешний контейнер-получатель для текущего пользователя и список рассылки для потока переписки. Созданный внешний получатель передается соответствующему списку рассылки, и пользователь оповещается обо всех обновлениях в переписке.


Приложение А. Примеры программного кода

Выдержки из файла GLOBAL.ASA

Файл GLOBAL.ASA проходит по папкам, открывая для каждой из них сеанс чтения CDO.

DimaSessionRead()

For Each folSubFolder in folFolder.folders

       intArrayIndex = intArrayIndex + 1

       ReDim Preserve aSessionRead(intArrayIndex)

‘ Создать сеанс, войти и сохранить сеанс в массиве

       Set objCdoSessionReadTemp = createObject("MAPI.Session")

       objCdoSessionReadTemp.Logon  ,,,,,,SERVER_Exchange & vblf & "WebUser"

       Set aSessionRead(intArrayIndex) = objCdoSessionReadTemp

Next

‘ Создать массив сеансов как переменную приложения

Application(“aCDOSessions”) = aSessionRead

Выдержка из файла NAV.ASP

Файл NAV.ASP находит и отображает для навигации группы сообщений.

<%

Option Explicit

%>

<!-- #include file="errorcheck.inc" -->

<%

'*********************************************************************

'*  Подпрограмма WalkFolders обходит основные папки на сервере *

'*  Exchange и извлекает имена выбранной в данный момент группы       *

'*********************************************************************

       Sub WalkFolders

'*********************************************************************

'On Error Resume Next

Session("Proc") = "Nav.asp - WalkFolders"

'*********************************************************************

              Dim aMaster(), DiscussionNamesTab

              Dim i, j

              Dim blnNewGroup

              Dim strMasterFolder, strFolder, strMasterTemp, strGroup, strDiscussion

              Dim Folder, DiscussionNames, folMain, folFolder, folSubFolder

              DiscussionNamesTab = Application("aobjCdoSessionWrite")

              Set DiscussionNames = DiscussionNamesTab(0)

'*********************************************************************

If Err.number <> 0 Then LogActivity "Error Log", "DiscussionNames Fail" & vbCrLf & Err.description

'*********************************************************************

              j = 0

              If Len(Request.QueryString("masterfolder")) = 0 Then

                     Session("masterfolder") = ""

                     For Each folFolder In DiscussionNames.Folders

                           Response.write (Chr(9) & "<TR><TD><FONT FACE='Verdana, Arial' SIZE=2 COLOR=#ff3300><B><A HREF='nav.asp?masterfolder=" & folFolder.Name & "' TARGET=nav STYLE='color: #ff3300'>" & folFolder.Name & "</A></B></TD></TR>" & Chr(13))

                     Next

              Else

                     Session("masterfolder") = Request.QueryString("masterfolder")

                     For Each folFolder In DiscussionNames.Folders

                           If folFolder.Name = Request.QueryString("masterfolder") Then

                                  Response.write (Chr(9) & "<TR><TD COLSPAN=2><FONT FACE='Verdana, Arial' SIZE=2 COLOR=#ff3300><B><A HREF='nav.asp' TARGET=nav STYLE='color: #ff3300'>" &  folFolder.Name & "</A></B></TD></TR>" & Chr(13))

                                  For Each folSubFolder In folFolder.Folders

                                         j = j + 1

                                         strMasterFolder = Server.URLEncode(Request.QueryString("masterfolder"))

                                         strDiscussion = Server.URLEncode(folSubFolder.Name)

                                         Response.write (Chr(9) & "<TR><TD><IMG SRC='/images/spacer.gif' HEIGHT=1 WIDTH=10></TD><TD><FONT FACE='Verdana, Arial' SIZE=1><A HREF='/include/EnumConv.asp?strSubFolder=" & strDiscussion & "&iPage=1&Depth=0&folderID=" & folSubFolder.ID & "&Session=" & j & "' TARGET='main'><B>" & folSubFolder.Name & "</B></A> (" & folSubFolder.Messages.Count & ")</TD></TR>" & Chr(13))

                                  Next

                           Else

                                  For Each folSubFolder In folFolder.Folders

                                         j = j + 1

                                  Next

                                  Response.write (Chr(9) & "<TR><TD COLSPAN=2><FONT FACE='Verdana, Arial' SIZE=2 COLOR=#ffcc00><B><A HREF='nav.asp?masterfolder=" & folFolder.Name & "' TARGET=nav STYLE='color: #ff3300'>" &  folFolder.Name & "</A></B></TD></TR>" & Chr(13))

                           End If

                     Next

              End If

       End Sub

%>

Пример 3 – выдержка из файла ENUMCONV.ASP

 

Dim aMsgIDs()

Sub getMsgIDs

       objCurMessages.Filter = Nothing

       Set objCurMessFilt = objCurMessages.Filter

‘ Отфильтровать набор сообщений глубины 0

       objCurMessFilt.Fields.Add "Depth", 8, "0"

       iFilter = 0

‘ Отсортировать набор по убыванию дат

       objCurMessages.Sort 2, CdoPR_MESSAGE_DELIVERY_TIME

       i = 0

       ReDim aMsgIDs(0)

‘ Построить массив кодов сообщений

       For Each Message in objCurMessages

              i = i + 1

              ReDim Preserve aMsgIDs(i)

              aMsgIDs(i) = Message.ID

       Next

End Sub

Пример 4 – выдержка из файла TREECTRL.ASP

‘ Получить строку запроса

strDepth = Request.QueryString("Depth")

strConvTopic = Request.QueryString("Conv")

strConvIndex = Request.QueryString("Cindx")

Dim aMsgIDs()

Sub getExpandedMsgIDs

       objCurMessages.Filter = Nothing

       Set objCurMessFilt = objCurMessages.Filter

‘ Отфильтровать набор по глубине

       If Len(strDepth) > 0 Then

              objCurMessFilt.Fields.Add "Depth", 8, strDepth

       End If

‘ отфильтровать по переписке

       If Len(strConvTopic) > 0 Then objCurMessFilt.Conversation = strConvTopic

‘ Отсортировать по дате

       objCurMessages.Sort 1, CdoPR_MESSAGE_DELIVERY_TIME

       i = 0

       ReDim aMsgIDs(0)

‘ Построить массив кодов сообщений

       For Each Message in objCurMessages

              If InStr(Message.ConversationIndex, strConvIndex) > 0 Then

                     i = i + 1

                     ReDim Preserve aMsgIDs(i)

                     aMsgIDs(i) = Message.ID

              End If

       Next

End Sub

Форматирование сообщений для отображения в формате HTML

Файл BODY.ASP форматирует сообщения для правильного отображения в формате HTML.

Sub ObtainMsgInfo

‘ Получить сеанс CDO

       aSessionRead = Application("aSessionRead")

       Set objAMSession = aSessionRead(1)

       msgID = Request.QueryString("msgID")

‘ Взять сообщение

       Set Message = objAMSession.GetMessage(msgID,NULL)

‘ Взять папку для кнопок предыдущего и следующего сообщения

       Set objFolder = objAMSession.GetFolder(Message.FolderID)

       Set objMessagesColl = objFolder.Messages

objMessagesColl.Sort 1, CdoPR_CONVERSATION_TOPIC

       strSubject = Message.Subject

       strAuthor = Message.Sender

       strAuthorEmail = Message.Sender.Address

       strTime = Message.TimeCreated

‘ Отформатировать текст сообщения для правильного отображения в формате HTML

       strBody = Message.Text

       strBody = Server.HTMLEncode(strBody)

       strBody = Replace(strBody, Chr(13), "<BR>")

       strBody = Replace(strBody, "  ", "&nbsp; ")

       strBody = Replace(strBody, Chr(9), "&nbsp;&nbsp;&nbsp;&nbsp;")

       strPrevMsg = " "

       strNextMsg = " "

‘ Взять коды предыдущего и следующего сообщения и построить тег HTML IMG

       For Each objMessage In objMessagesColl

              If objMessage.ID = msgID Then

                     Set objPrevMsg = objMessagesColl.GetPrevious

                     If Not objPrevMsg Is Nothing Then

                           strPrevMsg = "<A HREF='body.asp?msgID=" & objPrevMsg.ID & _

                              "'><IMG SRC='/include/images/prev_arrow.gif' Border=0></A>"

                           objMessagesColl.GetNext

                     End If

                     Set objNextMsg = objMessagesColl.GetNext

                     If Not objNextMsg Is Nothing Then

                           strNextMsg = "<A HREF='body.asp?msgID=" & objNextMsg.ID & _

                              "'><IMG SRC='/include/images/next_arrow.gif' Border=0></A>"

                     End If

              End If

       Next

End Sub

Выдержка из сценария агента для службы событий Event Service севера Microsoft Exchange Server 5.5

 

‘ Создать объект файловой системы

Set objFileSystem = Server.CreateObject("Scripting.FileSystemObject")

strFileName =  strRootDirectoryname & "\ptr_" & strConversationIndex & ".SMK"  

‘ Создать (текстовый) файл указателя с соответствующей информацией

Set objSMKFile = objFileSystem.CreateTextFile(strFileName, "True")

       objSMKFile.WriteLine ("SUBJ" & itmMessage.Subject)

       objSMKFile.WriteLine ("AUTH" & Replace( itmMessage.Sender.Name, CHR(34), ""))

       objSMKFile.WriteLine ("TIME" & Mid(itmMessage.TimeReceived, 1, _

          Len(itmMessage.TimeReceived) - 6) & Mid(itmMessage.TimeReceived, _

          Len(itmMessage.TimeReceived) - 2))

       objSMKFile.WriteLine ("MSID" & itmMessage.ID)

objSMKFile.Close

 

 

 

Службы подписки

Подпрограмма SubscribeUser открывает подключение LDAP к серверу Microsoft Exchange Server и создает, если необходимо, внешний контейнер получателя и список рассылки.

Sub SubscribeUser(DLName)

       On Error Resume Next

       Dim strSubscribersContainerADSPath, strMSPrivMDBPath, strMail

       Dim strSMTPExt, strSMTPAddr, strx400Addr, strLDAPRecip, strEmail

       Dim strName, strLDAPDL, strRecipContainer

       Dim objContainer, objIADs, objLDAPDL, objLDAPRecip, objMailbox

       Dim objMember, objMSPrivMDB, objNewDL, objRecipients

       Dim intPos

       Dim blnExistsInDL

 ‘Взять адрес электронной почты и имя автора из переменных сеанса

       strEmail = Session("emailAddress")

       strName = Session("nameAuthor")

 ‘Создать сеанс LDAP и посмотреть, существует ли внешний получатель

       Set objIADs = GetObject("LDAP:")

       strLDAPRecip = "LDAP://" & LDAPServer & "/cn=" & strName & _

          ",cn=Subscribers,cn=Recipients,ou=" & LDAPSite & ",o=" & _

          LDAPOrg

       Set objLDAPRecip = objIADS.OpenDSObject(strLDAPRecip, _

          LDAPUserName, LDAPPassword, 0)

‘Если внешнего получателя нет, создать его

       If objLDAPRecip Is Nothing Then

              strRecipContainer = "LDAP://" & LDAPServer & _

                 "/cn=Subscribers,cn=Recipients,ou=" & LDAPSite & ",o=" _

                 & LDAPOrg

              Set objContainer = objIADs.OpenDSObject(strRecipContainer,_

                 LDAPUserName, LDAPPassword, 0)

              Set objMailbox = Container.Create("Remote-Address", "cn=" _

                 & strName)

              objMailbox.Put "Target-Address", strEmail

              objMailbox.Put "MAPI-Recipient", False

              objMailbox.Put "TextEncodedORaddress", "c=US;a= ;p=" & _

                 LDAPOrg & ";o=" & LDAPSite & ";g=" & strName & ";"

              objMailbox.Put "mail", strEmail

              objMailbox.Put "cn", strName

              objMailbox.Put "uid", strName

              objMailbox.SetInfo

       End If

 ‘Проверить, существует ли список рассылки

       strLDAPDL = "LDAP://" & LDAPServer & "/cn=" & DLName & _

          ",cn=Vap,cn=Recipients,ou=" & LDAPSite & ",o=" & LDAPOrg

       Set objLDAPDL = objIADS.OpenDSObject(strLDAPDL, LDAPUserName, _

          LDAPPassword, 0)

 ‘Если списка рассылки нет, создать его

       If objLDAPDL Is Nothing Then

              strSubscribersContainerADSPath = "LDAP://" & LDAPServer & _

                 "/cn=Vap,cn=Recipients,ou=" & LDAPSite & ",o=" & LDAPOrg

              strMSPrivMDBPath = "LDAP://" & LDAPServer & _

                 "/cn=Microsoft Private MDB,cn=" & LDAPServer & _

                 ",cn=Servers ,cn=Configuration,ou=" & LDAPSite & ",o=" _

                 & LDAPOrg

              Set objMSPrivMDB = objIADS.OpenDSObject(strMSPrivMDBPath, _

                 LDAPUserName, LDAPPassword, 0)

              objMSPrivMDB.GetInfo

              strMail = objMSPrivMDB.Get("mail")

              Set objMSPrivMDB = Nothing

              intPos = InStr(strMail, "@")

              strSMTPExt = Mid(strMail, intPos, Len(strMail))

              strSMTPAddr = Replace(DLName, " ", "") & strSMTPExt

              strx400Addr = "c=US;a= ;p=" & LDAPOrg & ";o=" & LDAPSite &_

                 ";s=" & DLName & ";"

              Set objRecipients = _

                 objIADs.OpenDSObject(strSubscribersContainerADSPath, _

                 LDAPUserName, LDAPPassword, 0)

              Set objNewDL = objRecipients.Create("groupOfNames", "cn=" _

                 & DLName)

              objNewDL.Put "cn", CStr(DLName)

              objNewDL.Put "uid", CStr(DLName)

              objNewDL.Put "distinguishedName", CStr("cn=" & DLName & _

                 ",cn=Vap,cn=Recipients,ou=" + LDAPSite + ",o=" + _

                 LDAPOrg)

              objNewDL.Put "mail", CStr(strSMTPAddr)

              objNewDL.Put "textEncodedORaddress", CStr(strx400Addr)

              objNewDL.Put "Extension-Attribute-11", CStr(strMsgID)

              objNewDL.SetInfo

              objNewDL.Add strLDAPRecip

              Response.Write("You have subscribed to <B>" & strSubject &_

                 "</B>.<P>")

       Else

              blnExistsInDL = False

 ‘Проверить, подписан ли пользователь на этот список рассылки

              For Each objMember in objLDAPDL.Members

                     If objMember.Name = "cn=" & strName Then

                           blnExistsInDL = True

                           Exit For

                     End If

              Next

              If blnExistsInDL Then

                     Response.Write( _

                        "You already have a subscription to <B>" & _

                        strSubject & "</B>.<P>")

              Else

‘Если пользователь не подписан, добавить его в список

                     objLDAPDL.Add strLDAPRecip

                     Response.Write("Subscription to <I><B>" & _

                        strSubject & "</B></I> Successful!<P>")

              End If

       End If

 ‘Очистить ссылки объекта

       Set objContainer = Nothing

       Set objIADs = Nothing

       Set objLDAPDL = Nothing

       Set objLDAPRecip = Nothing

       Set objMailbox = Nothing

       Set objMember = Nothing

       Set objMSPrivMDB = Nothing

       Set objNewDL = Nothing

       Set objRecipients = Nothing

End Sub

Поддержка гиперссылок и вложений

Функция FormatLinks обрабатывает любые ссылки http или ftp в тексте сообщения.

Function FormatLinks(strText)

       Dim strTextStart, strLink, strTextEnd

       Dim iLinkStart, iLinkEnd, iLinkEndLetter, iHTTPStart, iFTPStart

       strText = strText & " "

‘Найти начало ссылки

       iHTTPStart = InStr(LCase(strText), "http://")

       iFTPStart = InStr(LCase(strText), "ftp://")

       If iFTPStart > 0 Then

              If (iHTTPStart < iFTPStart) AND (iHTTPStart > 0) Then

                     iLinkStart = iHTTPStart

              Else

                     iLinkStart = iFTPStart

              End If

       Else

              iLinkStart = iHTTPStart

       End If

       If iLinkStart > 0 Then

              strTextStart = Left(strText, iLinkStart - 1)

 ‘Найти конец ссылки

              iLinkEnd = InStr(iLinkStart, strText, " ")

              If iLinkEnd < Len(strText) Then

                     strLink = Mid(strText, iLinkStart, (iLinkEnd - _

                        iLinkStart))

                     iLinkEndLetter = Asc(Right(strLink, 1))

 ‘Просмотреть в цикле остальную часть сообщения, пока все ссылки не будут обработаны

                     Do Until (iLinkEndLetter > 64 AND _

                        iLinkEndLetter < 91) OR _

                        (iLinkEndLetter > 96 AND _

                        iLinkEndLetter < 123) OR _

                        (iLinkEndLetter > 46 AND _

                        iLinkEndLetter < 59)

                           iLinkEnd = iLinkEnd - 1

                           strLink = Mid(strText, iLinkStart, _

                              (iLinkEnd - iLinkStart))

                           strTextEnd = FormatLinks(Mid(strText, _

                              iLinkEnd))

                           iLinkEndLetter = Asc(Right(strLink, 1))

                     Loop

                     strTextEnd = FormatLinks(Mid(strText, iLinkEnd))

              Else

                     strLink = Mid(strText, iLinkStart)

                     strTextEnd = ""

              End If

              FormatLinks = strTextStart & "<A HREF='" & strLink & _

                 "' TARGET='_blank'>" & strLink & "</A>" & strTextEnd

       Else

              FormatLinks = strText

       End If

End Function

Визуализация времени ожидания

 

              Response.Write("<SCRIPT LANGUAGE=JavaScript>")

           Response.Write("var pageload=window.open('','DisplayWindow','height=30,width=170,toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0,top=150,left=150');")

              Response.Write("pageload.document.open('text/html');")

              Response.Write("pageload.document.writeln('<HTML><HEAD><TITLE>Page Loading...</TITLE><BODY BGCOLOR=#FFFFFF>');")

              Response.Write("pageload.document.writeln('<CENTER><FONT FACE=\'MS Sans Serif, Verdana, Arial, Helvetica\' SIZE=1>Please wait while " & Session("strSubFolder") & " loads...</FONT></CENTER><BR>');")

           Response.Write("</SCRIPT>" & vbCr)

              iTotCount = CInt((objCurMessages.Count / 11) + .5)

              For j = 1 to objCurMessages.Count

                     If j Mod iTotCount = 0 Then

                           Response.Write("<SCRIPT LANGUAGE=JavaScript>")

                           Response.Write("pageload.document.write('<IMG SRC=\'images/bullet_progress.gif\' WIDTH=15 HEIGHT=20 BORDER=0>');")

                           Response.Write("</SCRIPT>" & vbCr)

                     End If

                     Set Message = objCurMessages.Item(j)

                     If IsProcessed Then

                           i = i + 1

                           ReDim Preserve aMsgIDs(i)

                           aMsgIDs(i) = Message.Fields(CdoPR_INTERNET_ARTICLE_NUMBER)

                     End If

              Next

           Response.Write("<SCRIPT LANGUAGE=JavaScript>")

              Response.Write("pageload.document.writeln('</BODY></HTML>');")

              Response.Write("pageload.document.close();")

              Response.Write("pageload.close();")

                    Response.Write("</SCRIPT>" & vbCr)