Аннотация
Прочитав эту статью, вы узнаете, как оптимизировать секцию задач
Research в Office 2003.
Содержание
Введение
Прежде чем начать
Анатомия Web-сервиса в секции задач Research
Функция Registration
Функция Query
Регистрация и тестирование Web-сервиса
Как узнать, что ищет пользователь
Вставка данных в документ пользователя
Резюме
Введение
Благодаря новинке Microsoft® Office 2003 - секции задач
(task pane) Research, доступной в Microsoft Word 2003, Microsoft Excel
2003 и Microsoft PowerPoint 2003, - пользователи могут искать данные в
локальных и удаленных источниках прямо из этих программ. Некоторые
ресурсы включены по умолчанию. Так, пользователи Office 2003 могут
запрашивать такие справочники, как Encarta World Dictionary, а также
онлайновые ресурсы, например биржевые котировки.
Большинство ресурсов, доступных из Office 2003, в действительности
являются Web-сервисами. Создав Web-сервис, совместимый с секцией задач
Research (так называемый сервис Research), вы откроете пользователям
доступ к корпоративным источникам данных прямо из приложений Office
2003, где эти данные скорее всего и понадобятся.
В этой статье я расскажу о создании сервиса Research. Это позволит
вам разрабатывать собственные решения, поддерживающие более сложные
способы поиска и представления данных и способные, например:
- отображать список текстовых результатов в виде таблицы или
текста, разбитого на абзацы;
- показывать результаты поиска в виде списка с раскрывающимися
элементами;
- добавлять изображения в результаты поиска;
- запрашивать текстовые результаты для получения дополнительных
данных;
- вставлять найденные данные в текущий документ пользователя.
Прежде чем начать
Чтобы поэкспериментировать с этими новыми средствами, вы должны
установить:
- Microsoft Office 2003;
- Microsoft .NET Framework 1.0;
- Internet Information Services (IIS) 5.0;
- Microsoft Visual Studio® .NET 2002 (VS .NET).
Анатомия Web-сервиса в секции задач Research
Как и все Web-сервисы, сервис Research является приложением,
использующим открытые стандарты (вроде XML и SOAP) для взаимодействия с
клиентами по базовым протоколам Интернета. У Web-сервиса нет
собственного UI, он просто получает от клиента XML-документ (в данном
случае - от секции задач Research в Office 2003) и отвечает на
него передачей другого XML-документа. Клиент отвечает за передачу
"понятного" сервису XML-документа и за разбор документа, возвращенного
сервисом, для отображения его пользователю или передачи приложению. Если
в роли клиента выступает секция Research, она автоматически
отправляет соответствующий XML-документ, форматирует ответ Web-сервиса и
выводит его пользователю.
Секция Research способна выполнить основную часть работы,
поскольку вызываемые ею Web-сервисы специально рассчитаны на
взаимодействие с ней. При создании сервиса Research необходимо следовать
определенным правилам. Например, у такого Web-сервиса должно быть две
функции - Registration и Query, которые должны взаимодействовать с
помощью XML-пакетов, соответствующих предопределенным XML-схемам. Полные
схемы см. в Research SDK, а большинство элементов и атрибутов ключевых
схем будет описано ниже.
Функция Registration служит для регистрации сервиса Research в
одноименной секции задач. После регистрации сервис будет доступен через
раскрывающийся список Show Results From. Устанавливая сервис
Research как ресурс секции Research, пользователь инициирует
запрос к функции Registration этого сервиса. Полученный ответ
используется для создания соответствующих записей в реестре Windows, его
формат должен соответствовать схеме
Microsoft.Search.Registration.Response.xsd.
Функция Query вызывается, когда пользователь запрашивает информацию у
сервиса Research при поиске по ключевому слову либо через форму секции
задач Research. Секция Research посылает сервису
XML-пакет, соответствующий схеме Microsoft.Search.Query.xsd, а сервис
должен прислать ответ, основанный на одной из схем семейства
Microsoft.Search.Response.xsd.
Функция Registration
Чтобы создать сервис Research, откройте Visual Studio .NET и откройте
новый проект ASP.NET Web Service. Сохранить проект можно в папке
Web-сайта IIS по умолчанию (http://localhost).
Перед использованием сервис Research необходимо зарегистрировать.
Пользователи Office 2003 регистрируют сервис Research вызовом его
функции Registration. Такая функция использует пространство имен
urn:Microsoft.Search. Ее код создает и возвращает XML-пакет, формат
которого определяется схемой Microsoft.Search.Registration.Response.
Office 2003 использует данные этого пакета для добавления ссылки на
Web-сервис в реестр Windows.
Часть данных XML-пакета (табл. 1) применяется для описания самого
провайдера.
Табл. 1. Элементы, описывающие провайдер
Элемент |
Описание |
Message |
Сообщение, отображаемое при
добавлении сервиса Research к секции задач Research |
Id |
GUID, идентифицирующий ваш сервис
Research в реестре Windows |
Name |
Имя провайдера, отображаемое в
диалоговом окне свойств сервиса и в реестре |
QueryPath |
Путь для функции Query сервиса
Research, которую секция Research вызывает, когда
пользователь делает запрос к сервису |
RegistrationPath |
Путь для функции Registration
сервиса Research. После установки сервиса Office 2003
периодически вызывает эту функцию для проверки на наличие
обновлений для этого сервиса |
Type |
Коммуникационный интерфейс,
требуемый провайдером |
Данные узла Service XML-пакета (табл. 2) описывают сервис Research.
Табл. 2. Элементы узла Service
Элемент |
Описание |
Id |
GUID, используемый при вызове
функции Query. Позволяет отличить ответ вашего сервиса Research
от ответов аналогичных сервисов |
Name |
Имя, отображаемое в списке Show
Results From секции задач Research |
Description |
Описание, показываемое в
диалоговом окне свойств сервиса |
Copyright |
Сведения об авторских правах,
отображаемые в диалоговом окне свойств сервиса |
Display |
Имеет значение On или Off;
указывает, должен ли сервис показываться в списке Show
Results From |
Category |
Категория сервиса в списке Show
Results From и диалоговом окне свойств Research. Список
возможных значений этого элемента см. в схеме
Microsoft.Search.Registration.Response |
Код на Visual Basic .NET, необходимый для создания XML-пакета ответа
функции Registration, выглядит примерно так:
Imports System.Web.Services ´ добавляется автоматически
Imports System.Xml ´ необходимо для чтения и
´ формирования XML-пакетов
Imports System.IO ´ требуется для создания XML-пакетов в памяти
<WebService(Namespace:="urn:Microsoft.Search")> _
Public Class MyResearchPane
Inherits System.Web.Services.WebService
<WebMethod()> Public Function Registration(ByVal regXML As String) As
String
Dim ioMemStream As New MemoryStream()
Dim myXMLwriter As New XmlTextWriter(ioMemStream, Nothing)
With myXMLwriter
.Indentation = 4
.IndentChar = " "
.WriteStartDocument()
.WriteStartElement("ProviderUpdate", _
ns:="urn:Microsoft.Search.Registration.Response")
.WriteElementString("Status", "SUCCESS")
.WriteStartElement("Providers")
.WriteStartElement("Provider")
.WriteElementString("Message", _
"Congratulations! You´ve registered Research Pane Examples!")
.WriteElementString("Id", _
"{E545CFA2-E5AC-408a-92D9-E8C8487E6D69}")
.WriteElementString("Name", "Research Pane Examples")
.WriteElementString("QueryPath", _
"http://localhost/StepByStep/Query.asmx")
.WriteElementString("RegistrationPath", _
"http://localhost/StepByStep/Registration.asmx")
.WriteElementString("Type", "SOAP")
.WriteStartElement("Services")
.WriteStartElement("Service")
.WriteElementString("Id", _
"{942F685E-0935-42c8-80C5-95DB0D129910}")
.WriteElementString("Name", "Research Pane Examples")
.WriteElementString("Description", _
"Research Pane Examples provides a simple example of " & _
"customizing the Office Research Pane.")
.WriteElementString("Copyright", _
"All content Copyright (c) 2003.")
.WriteElementString("Display", "On")
.WriteElementString("Category", "INTRANET_GENERAL")
.WriteEndElement() ´ Service
.WriteEndElement() ´ Services
.WriteEndElement() ´ Provider
.WriteEndElement() ´ Providers
.WriteEndElement() ´ ProviderUpdate
.WriteEndDocument()
End With
myXMLwriter.Flush()
ioMemStream.Flush()
ioMemStream.Position = 0
Dim iostReader As New IO.StreamReader(ioMemStream)
Return iostReader.ReadToEnd.ToString
End Function
Написав функцию Registration, можно ее проверить. Для этого выберите
в меню команду Build and Browse - вы увидите стандартную тестовую
страницу Web-сервиса. Щелкните ссылку Registration, ведущую на тестовую
страницу регистрации, затем кнопку Invoke. В окне браузера
появится XML-пакет ответа.
Итак, функция Registration готова, теперь ваш сервис Research может
регистрироваться в секции задач Research, но пока не способен
возвращать результаты. Для этого понадобится функция Query.
Функция Query
Типичный Web-метод Query обращается к источнику данных, например к
базе данных SQL Server или к сайту Windows SharePoint Services, за
сведениями, которые будут отображаться в секции задач Research.
Функция Query получает XML-пакет, соответствующий схеме
Microsoft.Search.Query, и должна вернуть XML-пакет, основанный на схеме
Microsoft.Search.Response.
Пакет ответа должен содержать хотя бы элементы, перечисленные в табл.
3.
Табл. 3. Обязательные элементы XML-пакета отклика
Элемент |
Описание |
ResponsePacket |
Корневой элемент, должен включать
атрибут xmlns со значением "urn:Microsoft.Search.Response" |
Response |
Включающий (outer) элемент с
ответом на конкретный запрос. Должен включать атрибут domain с
тем же GUID, что и в элементе Id узла Service XML-пакета,
являющегося ответом функции Registration |
QueryID |
GUID, уникально идентифицирующий
запрос, ответом на который является данный пакет |
Range |
Элемент, заключающий (outermost)
результаты, возвращаемые функцией Query. Как правило, функция
Query, возвращает только один узел результатов. Элемент Range
предусмотрен на случай, если один вызов вернет несколько узлов с
результатами |
Results |
Узел с данными, предназначенными
для отображения пользователю через секцию задач Research;
включает разметку, определяющую вид данных при выводе |
Status |
Состояние запроса. Как правило,
имеет значение "SUCCESS" |
Значение атрибута domain элемента Response должно соответствовать
GUID в Service ID, заданному в XML-пакете ответа функции Registration.
Этот GUID позволяет секции задач Research узнать ответ вашего
сервиса Research. Если этого атрибута нет, предполагается, что
Web-сервис не вернул результатов. QueryID GUID должен быть другим
уникальным значением.
Получив ответ, секция Research анализирует данные узла Results
и определяет, что следует отобразить. При визуализации показанного здесь
пакета ответа получается один абзац с заголовком Research Pane Examples
(рис. 1).
Рис. 1. Любой запрос (даже пустой) заставляет наш Web-сервис
выдавать один и тот же ответ
Узел Results обычно содержит узел Content. Тот в свою очередь
содержит элементы, описанные схемой Microsoft.Search.Response.Content.
Значения переданных в нем элементов визуализируются секцией Research
как форматированный текст. Список наиболее часто используемых элементов
узла Content приведен в табл. 4.
Табл. 4. Наиболее часто используемые элементы узла Content
Элемент |
Описание |
P |
Текстовый абзац |
Char |
Строка форматированного текста.
Всегда находится внутри другого элемента Content. Задает
полужирное, курсивное или подчеркнутое начертание |
Tabular |
Таблица пар "имя-значение". Должна
содержать один или несколько элементов Record, каждый с
собственными элементами Name и Value |
Image |
Путь к изображению, показываемому
в секции задач Research как часть результатов запроса |
Heading |
Абзац, раскрыв который, можно
получить дополнительную информацию |
NewQuery |
Гиперссылка, щелчок которой снова
вызывает функцию Query сервиса Research. Запрашиваемое при этом
ключевое слово задается через атрибут элемента NewQuery |
Вот пример простой функции Query на Visual Basic .NET:
<WebMethod()> Public Function Query(ByVal queryXml As String) As String
Dim queryTerm As String
Dim ioMemStream As New MemoryStream()
Dim myXMLwriter As New XmlTextWriter(ioMemStream, Nothing)
With myXMLwriter
.Indentation = 4
.IndentChar = " "
.WriteStartDocument()
.WriteStartElement("ResponsePacket", _
ns:="urn:Microsoft.Search.Response")
.WriteAttributeString("revision", value:=1)
.WriteStartElement("Response")
´ Этот GUID должен совпадать с Service ID,
´ указанным для функции Registration
.WriteAttributeString("domain", _
value:="{942F685E-0935-42c8-80C5-95DB0D129910}")
.WriteElementString("QueryID", _
"{690EF6D8-575D-4897-8F30-293E175C1B99}")
.WriteStartElement("Range")
.WriteStartElement("Results")
.WriteStartElement("Content", _
ns:="urn:Microsoft.Search.Response.Content")
.WriteElementString("P", "I heard you!")
.WriteEndElement() ´ закрыть тэг Content
.WriteEndElement() ´ закрыть тэг Results
.WriteEndElement() ´ закрыть тэг Range
.WriteElementString("Status", "SUCCESS")
.WriteEndElement() ´ закрыть тэг Response
.WriteEndElement() ´ закрыть тэг ResponsePacket
.WriteEndDocument()
End With
myXMLwriter.Flush()
ioMemStream.Flush()
ioMemStream.Position = 0
Dim iostReader As New IO.StreamReader(ioMemStream)
Return iostReader.ReadToEnd.ToString
End Function
После добавления этого кода функцию Query можно скомпилировать и
протестировать (с помощью команды Build and Browse) - вы увидите
XML-пакет в окне браузера.
Регистрация и тестирование Web-сервиса
Зарегистрировать и проверить сервис Research в Office 2003 нетрудно.
Для этого откройте Word, Excel или PowerPoint, вызовите секцию задач
Research командой Tools | Research из основного меню. Далее
щелкните внизу гиперссылку Research options, а затем кнопку
Add Services.
В поле Address диалогового окна Add Services введите
путь к странице Registration, как показано на рис. 2, и щелкните Add.
Откроется диалоговое окно установки, в нем щелкните кнопку Install.
После закрытия диалогового окна Research Options ваш сервис
Research готов к обработке запросов.
Рис. 2. Добавьте сервис, введя путь к странице Registration
Убедиться в успешной регистрации сервиса Research можно так.
Раскройте список Show results from в секции Research,
найдите в ней только что созданный сервис и выберите его.
Убедившись, что сервис зарегистрирован, можно добавить в функцию
Query остальной код и протестировать ее. Для этого скомпилируйте сервис
и откройте одну из программ Office 2003; регистрировать сервис после
каждой модификации функции Query не обязательно.
Как узнать, что ищет пользователь
Чтобы определить конкретный запрос и соответствующим образом
отреагировать на него, ваша функция должна выполнить разбор XML-пакета,
полученного от секции Research.
Структура пакета запроса соответствует схеме Microsoft.Search.Query.
Элемент QueryText содержит точную копию слова (или слов), введенных
пользователем в секции Research. Кроме того, пакет запроса
содержит узел Keywords с отдельными словами и их словоформами (например,
разговорными формами).
Если, разобрав XML-пакет, удается выяснить предмет запроса
пользователя, дальше можно использовать любой алгоритм для
предоставления соответствующего ответа. Вот типичный код для извлечения
элемента QueryText из пакета запроса:
Dim queryTerm As String
Dim requestXML As New XmlDocument()
requestXml.LoadXml(queryXml)
Dim nsmRequest As New XmlNamespaceManager(requestXML.NameTable)
nsmRequest.AddNamespace("ns", "urn:Microsoft.Search.Query")
queryTerm = requestXML.SelectSingleNode( _
"//ns:QueryText", nsmRequest).InnerText
Вставка данных в документ пользователя
Помимо текста, заголовков и гиперссылок, секция Research
поддерживает некоторые операции для передачи данных в документ
пользователя. Так, можно без труда указывать в ответе операции Insert и
Copy, а также добавлять поддержку собственных смарт-тэгов, установленных
на пользовательской машине. Для добавления кнопки Action (рис. 3) к
визуальному представлению ответа служит элемент Actions.
Рис. 3. Раскрывающийся список с операциями Copy и Insert
Операция Copy chores копирует информацию об элементе в
буфер обмена, а Paste chores - вставляет ее в текущий документ
там, где находится курсор ввода.
Чтобы задать операции, доступные через кнопку Action, добавьте к узлу
Actions соответствующие элементы Copy и Insert.
Элемент Text контролирует названия элементов меню, выводимых при
нажатии кнопки Action, а элемент Data определяет данные, копируемые и
вставляемые в документ при выборе пользователем соответствующих
операций.
Помимо элементов Copy и Insert, можно задействовать элемент Custom
для добавления к списку собственных смарт-тэгов.
Резюме
Создать Web-сервис для использования с секцией задач Research
в Word, Excel и PowerPoint из Office 2003, довольно просто. Для этого
достаточно написать функции для регистрации и запроса, после чего можно
подключить новый сервис к секции Research. Масса возможностей
открывается через пакет ответа, чье содержимое секция задач Research
отображает пользователям. Эта функциональность Office 2003 проста в
применении и удобна во многих проектах.