Введення в дослідну бібліотеку

У цьому місяці я хочу розповісти про таємний скарб (у всякому разі,
я так вважаю) Microsoft Office 2003 – про дослідницьку бібліотеці
(Research library). Оскільки в Office 2003 багато інших чудових
коштів, цій бібліотеці особливої уваги не приділяли. Вона доступна в
нових версіях Microsoft Word, Microsoft Excel, Microsoft PowerPoint®,
Microsoft Outlook®, Microsoft Publisher, Microsoft OneNote ™ і
Internet Explorer. У всіх цих додатках дослідна бібліотека
доступна у вигляді секції завдань (task pane).

Що таке дослідна бібліотека? Як і випливає з її назви,
це вбудований інструмент для досліджень, що дозволяє шукати
інформацію з Office в найрізноманітніших джерелах. Деякі
джерела є в Office, інші є зовнішніми сервісами, для
використання яких потрібне з'єднання з Інтернетом. На рис. 1
показана робота вбудованого тезаурусу англійських слів.

Рис 1. Секція завдань Research в Microsoft Word 2003

У секції завдань Research можна виділити наступні елементи.

  1. У більшості програм, які підтримуються для доступу до
    дослідної бібліотеці досить натиснути кнопку Research
    на панелі інструментів Standard. Крім того, для доступу до
    секції завдань Research можна відкрити секцію завдань (View |
    Task Pane
    ) І вибрати Research зі списку доступних секцій.
  2. Після того як секція завдань Research відкрита, введіть
    текст для пошуку в поле Search for. Додатково
    користувач може клацнути текст у документі, одночасно
    утримуючи клавішу ALT в натиснутому стані. Тоді додаток Office
    відкриває секцію завдань і поміщає текст у полі Search for.
  3. Потім виберіть сервіс досліджень зі списку сервісів. Далі в
    цій статті я розповім про деякі сервісах. І нарешті, клацніть
    кнопку Go (зелену стрілку), щоб запустити пошук.
  4. Секція завдань Research містить кнопки Back і
    Forward
    , Аналогічні таким же кнопкам браузерів і дозволяють
    переходити до результатів попередніх операцій пошуку.
  5. Секція завдань Research виводить результати пошуку. В одній
    операції пошуку можна задіяти декілька сервісів, результати
    поділяються заголовком, що містить ім'я сервісу.
  6. Секція завдань Research підтримує найрізноманітніші
    способи управління результатами. На рис. 1 наведено спадне
    меню, яке дозволяє вставити або скопіювати виділений текст у
    поточний документ.
  7. У самому низу секції завдань Research знаходиться посилання
    Research options
    . Вона відкриває діалогове вікно Research
    Options
    , Показане на рис. 2.

Рис. 2. Діалогове вікно Research Options для налаштування сервісів
досліджень, що викликаються з Office

Діалогове вікно Research Options використовується для додавання
нових сервісів досліджень, оновлення існуючих, зміни
параметрів контролю за діями дітей (Parental controls), а також
переглянути властивості встановлених сервісів. Як видно з рис. 2, Office
2003 Beta 2 поставляється з набором сервісів досліджень. Деякі з
них перераховані нижче.

Більшості з цих сервісів потрібно з'єднання з Інтернетом. Якщо
користувач не підключений, деякі сервіси виявляться недоступними.
Потребують з'єднання сервіси призначені для одержання актуальної
інформації з багатьох корисних джерел у Web. Один з моїх самих
улюблених – сервіс досліджень MSN Money Stock Quotes. На рис. 3 показані
результати пошуку по рухомому рядку котирувань на MSFT.

Рис. 5. Взаємодія між Office і Web-сервісом XML
дослідної бібліотеки

{
Написи на малюнку:
RegistrationQuery schema – Схема RegistrationQuery
RegistrationResponse schema – Схема RegistrationResponse
QueryPacket schema – Схема QueryPacket
Response schema – Схема Response
Office – Office
Research Service – Сервіс досліджень
}

  1. Користувач клацає кнопку Add Service діалогового вікна
    Research Options (Рис. 2). Він вказує посилання на сторінку
    реєстрації сервісу дослідної бібліотеки. Сторінка
    реєстрації містить Web-метод Registration().
  2. Registration() повертає інформацію про провайдера сервісу,
    тип сервісу, а також його категорію і покажчик на Web-метод
    Query()
    , Використовуваний для пошуку. Тепер сервіс готовий до
    використання.
    Примітка Вам може здатися, що тут дуже багато
    роботи покладено на користувача, якому не обов'язково захочеться
    возитися з додаванням сервісу. Для вирішення цієї проблеми є два
    шляху: (1) передбачити інсталяційний файл, створює необхідні
    запису в реєстрі для дослідницької бібліотеки або (2)
    задіяти вбудований в Office механізм виявлення для
    додавання та оновлення сервісів дослідних бібліотек. Коли
    організація розгортає Office 2003, в програму установки можна
    включити покажчик, що дозволяє виявляти Web-сервіси XML. Це
    дозволяє додавати нові сервіси, не вимагаючи ніяких дій від
    користувача.
  3. Користувальницькі запити надсилаються від дослідницької
    бібліотеки Web-методу Query() сервісу.
  4. Останній розбирає запит і формулює відповідь, яка
    надсилається назад Office. Додаток Office виводить результати.
    Взаємодія між Office і Web-сервісом XML має задовольняти
    набору XML-схем, визначених у Office Research SDK. Наприклад, пакет
    відповіді на реєстрацію, заснований на схемі відповіді, може виглядати
    так:

    <?xml version="1.0" encoding="utf-8"?>
    <ProviderUpdate Xmlns="urn:Microsoft.Search.Registration.Response">
        <Status>SUCCESS</Status>
        <Providers>
        <Provider>
    <Message> This is a sample research library </ Message>
    <Id> {9FF837AF-34D6-4a94-BB52-B0F19F3A343A} </ Id>
            <Name>OfficeZealot.com</Name>
            <QueryPath>
            http://localhost/googleresearchlibrarycsharp/Query.asmx
            </QueryPath>
            <RegistrationPath>
    http://localhost/googleresearchlibrarycsharp/registration.asmx <
            </RegistrationPath>
            <AboutPath/>
            <Type>SOAP</Type>
            <Services>
                <Service>
    <Id> {CD144577-9D90-4144-AE38-0D6553CA4004} </ Id>
                <Name>Google Web Search (CSharp)</Name>
    <Description> Google Web Service research library </ Description>
    <Copyright> All content Copyright OfficeZealot.com (c) 
                2003.</Copyright>
                <Display>On</Display>
                <Category>RESEARCH_GENERAL</Category>
                </Service>
            </Services>
        </Provider>
        </Providers>
    </ProviderUpdate>
    

    Ці дані передаються користувачеві при установці сервісу
    дослідної бібліотеки. Крім того, в них містяться відомості,
    необхідні Office для взаємодії із сервісом на віддаленому
    сервері.

Більш глибоке вивчення Web-сервісу XML

Як вже згадувалося, бібліотека складається з Web-сервісу XML з двома
Web-методами. Обидва методи співіснувати в одному файлі Web-сервісу.
Проте я вважаю за краще логічно і фізично розділити їх з метою
спрощення коду. Таким чином, сервіс досліджень Google Web Service
містить два основних файлу:

  1. Файл Registration.asmx для Web-методу Registration().
  2. Файл TheQuery.asmx для Web-методу Query().

Office очікує, що відповіді Web-методів підпорядковуються схемами бібліотеки
досліджень і пов'язаним з ними просторів імен. Таким чином, для
кожного Web-сервісу потрібно визначити відповідне простір імен для
відповіді, а саме urn: Microsoft.Search. У C # при визначенні Web-сервісу
використовується наступний атрибут:

[WebService(Namespace="urn:Microsoft.Search")]

У Visual Basic. NET:

<WebService(Namespace:="urn:Microsoft.Search")>

Ця конструкція вказує. NET Framework укласти тіла SOAP-відповідей
в простір імен urn: Microsoft.Search.

Далі наведено код на C # для Web-методу Registration(),
зберігається у файлі Registration.asmx.cs

[WebMethod (CacheDuration = 86400)] / / кешувати на весь день,
/ / Оскільки дані змінюються рідко
/ / (86400 секунд = 24 годинах)
public string Registration(string registrationxml)
{
    string physicalPath = 
HttpContext.Current.Server.MapPath ("."). ToString ();
    string httpPath = 
ConfigurationSettings.AppSettings ["ServerPath"] 
+ HttpContext.Current.Request.ApplicationPath + "/";

    XmlDocument registrationResponse = new XmlDocument();
    registrationResponse.Load(physicalPath + 
    "RegistrationResponse.xml");
           
    XmlNamespaceManager nsm = 
new XmlNamespaceManager (registrationResponse.NameTable);
nsm.AddNamespace ("ns", "urn: Microsoft.Search.Registration.Response");

registrationResponse.SelectSingleNode ("/ / ns: QueryPath", nsm). InnerText = 
        httpPath + "Query.asmx";
registrationResponse.SelectSingleNode ("/ / ns: RegistrationPath", 
nsm). InnerText = httpPath + "Registration.asmx";
registrationResponse.SelectSingleNode ("/ / ns: AboutPath", nsm). InnerText =
        httpPath + "about.asmx";

    return registrationResponse.InnerXml.ToString();
}

Відповідь на реєстрацію досить простий, так як він лише містить
відомості про сервіс дослідної бібліотеки. Код завантажує локальний
XML-файл RegistrationResponse.xml, службовець загальним шаблоном для відповіді, і
вставляє в нього додаткові елементи, які визначають на етапі
виконання. Все це повертається Office.

Нижче приведений код Web-методу Query() і однієї з його залежних
закритих функцій:

[WebMethod (CacheDuration = 3600)] / / кешувати на 1 годину
public string Query(string queryXml)
{
/ / Перевірити, задано Чи має значення для запиту
    if (queryXml.Length == 0)
        return "";

    string queryString;
    string applicationName;
    int startAt = 1;

    XmlDocument requestXml = new XmlDocument();
    try
    {
        requestXml.LoadXml(queryXml.ToString());

        XmlNamespaceManager nsmRequest = 
            new XmlNamespaceManager(requestXml.NameTable);
nsmRequest.AddNamespace ("ns", "urn: Microsoft.Search.Query");
        nsmRequest.AddNamespace("oc", 
"Urn: Microsoft.Search.Query.Office.Context");

queryString = requestXml.SelectSingleNode ("/ / ns: QueryText", 
             nsmRequest).InnerText;
applicationName = requestXml.SelectSingleNode ("/ / oc: Name", 
            nsmRequest).InnerText;
        try
        {
startAt = Convert.ToInt32 (requestXml.SelectSingleNode ("/ / ns: StartAt", 
                nsmRequest).InnerText.ToString());
        }
        catch
        {
            startAt = 1;
        }
    }
    catch
    {
/ / Розбір queryXML не вдався,
/ / Використати вхідні рядок для пошуку в Google
        queryString = queryXml;
    }
                
    XmlDocument responseWrapper = new XmlDocument();
    try
    {
responseWrapper.Load (physicalPath + "ResponseWrapper.xml");
    }
    catch
    {
/ / Не можна розібрати оболонку відповіді, повернути порожній рядок
        return "";
    }
    XmlNamespaceManager nsmResponse = 
        new XmlNamespaceManager(responseWrapper.NameTable);
nsmResponse.AddNamespace ("ns", "urn: Microsoft.Search.Response");

responseWrapper.SelectSingleNode ("/ / ns: Range", nsmResponse). InnerXml = 
        QueryGoogle(queryString, startAt);
    return responseWrapper.InnerXml.ToString();
}

private string QueryGoogle(string queryString, int startAt)
{
    StringWriter queryResponse = new StringWriter();
    XmlTextWriter writer = new XmlTextWriter(queryResponse);

    GoogleSearchService search = new GoogleSearchService();
    try 
    {
/ / Викликати пошуковий метод
        GoogleSearchResult results = 
search.doGoogleSearch (ConfigurationSettings.AppSettings ["GoogleKey"], 
queryString, startAt, PageCount, true, "", true, "", "", "");

/ / Елементи для посилань Previous | Next
writer.WriteElementString ("StartAt", startAt.ToString ());
writer.WriteElementString ("Count", PageCount.ToString ());
        writer.WriteElementString("TotalAvailable", 
            results.estimatedTotalResultsCount.ToString());

/ / Початок елемента Results
        writer.WriteStartElement("Results");
/ / Початок елемента Content
        writer.WriteStartElement("Content", 
            "urn:Microsoft.Search.Response.Content");

/ / Вставити зображення
        writer.WriteStartElement("Image");
writer.WriteAttributeString ("source", httpPath + "/ gLogo.gif");
        writer.WriteEndElement();

        foreach(ResultElement result in results.resultElements)
        {
            writer.WriteStartElement("Heading");
writer.WriteAttributeString ("collapsible", "true");
            
            if (result.title.Length> 0)
                writer.WriteElementString("Text", 
                    StripHtml(result.title).Trim());
            else
writer.WriteElementString ("Text", "No Title");

            if (result.snippet.Length > 0)
                writer.WriteElementString("P",
                    StripHtml(result.snippet));

            if (result.summary.Length>0)
            {
                writer.WriteStartElement("P");
                    writer.WriteStartElement("Char");
writer.WriteAttributeString ("light", "true");
writer.WriteString ("Description:");
                    writer.WriteEndElement();
writer.WriteString (StripHtml (result.summary));
                writer.WriteEndElement();
            }

            writer.WriteStartElement("Hyperlink");
writer.WriteAttributeString ("url", result.URL);
writer.WriteElementString ("Text", result.URL);
            writer.WriteEndElement();

writer.WriteEndElement (); / / заголовок
        }

writer.WriteElementString ("HorizontalRule ","");
        writer.WriteStartElement("Hyperlink");
            writer.WriteAttributeString("url", 
"Http://www.google.com/search?q =" + queryString);
            writer.WriteElementString("Text", 
"Continue your search at Google.com ...");
        writer.WriteEndElement();
        writer.WriteStartElement("Hyperlink");
            writer.WriteAttributeString("url", 
"Http://groups.google.com/groups?q =" + queryString);
            writer.WriteElementString("Text", 
                "Search at groups.Google.com ...");
        writer.WriteEndElement();
/ / Аналіз результатів пошуку
writer.WriteElementString ("P", "Search took" + 
Math.Round (results.searchTime, 2). ToString () + "seconds.");
writer.WriteElementString ("HorizontalRule ","");
writer.WriteStartElement ("Image"); / / вставити зображення
/ / Логотипу OZ
writer.WriteAttributeString ("source", httpPath + "/ oz15owide.gif");
        writer.WriteEndElement();

writer.WriteEndElement (); / / закрити елемент Content
writer.WriteEndElement (); / / закрити елемент Content

        writer.Close();

        return queryResponse.ToString();
    }
    catch (System.Web.Services.Protocols.SoapException ex) 
    {
        return "";
    }
}

Коли користувач запитує інформацію за допомогою секції завдань
Research
, Запит упаковується відповідно до схеми для запиту.
Потім дані передаються Web-методу Query() в параметрі queryXml.
Метод витягує рядок для пошуку з queryXml і передає її функції
QueryGoogle()
, В якій і виконується основна робота. Вона викликає
Google Web Service API, передаючи пошуковий рядок. Потім розбирає
відповідь від Google і упаковує його у відповідності зі схемою відповіді
дослідної бібліотеки. Нижче як приклад наведено
XML-пакет, відповідний відповіді на рис. 4.

<?xml version="1.0" encoding="utf-8"?>
<ResponsePacket Revision="1" xmlns="urn:Microsoft.Search.Response">
<Response Domain="{CD144577-9D90-4144-AE38-0D6553CA4004}">
    <Range>
        <StartAt>1</StartAt>
        <Count>2</Count>
        <TotalAvailable>738</TotalAvailable>
        <Results>
<Content Xmlns="urn:Microsoft.Search.Response.Content">
<Image Source="http://localhost/GoogleResearchLibraryCSharp//gLogo.gif"/>
            <Heading collapsible="true">
            <Text>Smart Solutions Opinion</Text>
<P> Office as Swiss Army Knife. Chris Kunicki .. </ P>
<Hyperlink Url="http://www.msofficemag.net/opinion/default.asp?sort=W&Ord=A">
<Text> Http://www.msofficemag.net/opinion/default.asp?sort=W&Ord=A </ Text>
            </Hyperlink>
            </Heading>
            <Heading collapsible="true">
<Text> What's New with Smart Tags in Office 11 </ Text>
<P> Rate this page: 4 users, 3.8 out of 5. Read User ... </ P>
<Hyperlink Url="http://msdn.microsoft.com/columns/office.asp">
<Text> Http://msdn.microsoft.com/columns/office.asp </ Text>
            </Hyperlink>
            </Heading>
            <HorizontalRule/>
<Hyperlink Url="http://www.google.com/search?q=Chris Kunicki">
<Text> Continue your search at Google.com ...</ Text>
            </Hyperlink>
<Hyperlink Url="http://groups.google.com/groups?q=Chris Kunicki">
<Text> Search at groups.Google.com ...</ Text>
            </Hyperlink>
            <P>Search took 0.19 seconds.</P>
            <HorizontalRule/>
<Image Source="http://localhost/GoogleResearchLibraryCSharp//oz15owide.gif"/>
        </Content>
        </Results>
    </Range>
    <Status>SUCCESS</Status>
    </Response>
</ResponsePacket>

Query.asmx інтенсивно використовує об'єкт XMLTextWriter. Він
надає ефективний і простий спосіб створення синтаксично
коректного XML-документа. Тому що відповідь від інтерфейсу Query
базується на XML-схемі, необхідний коректний XML-документ, інакше секція
завдань Research з великою часткою ймовірності виведе порожнє вікно.
Наступний приклад ілюструє застосування об'єкта XMLTextWriter:

writer.WriteStartElement("P");
writer.WriteStartElement("Char");
writer.WriteAttributeString ("light", "true");
writer.WriteString("Description: ");
writer.WriteEndElement();
writer.WriteString(StripHtml(result.summary));
writer.WriteEndElement();

Що призводить до створення наступного XML:

<P> <Char Light="True"> Description: information from google </ Char> </ P>

На перший погляд здається, що створення простої XML-рядки зажадало
занадто багато коду. Проте типовий пакет відповіді містить 50-100 рядків
XML. І їм вже досить незручно управляти за допомогою звичайних строкових
функцій. Об'єкт XMLTextWriter не тільки ефективніше витрачає
пам'ять, але і простіше у створенні та управлінні.

Нотатки з окопів

Як ви розумієте, ми розглянули лише вершину айсберга. Будучи одним
з перших користувачів цієї технології, хотів би на закінчення
поділитися своїм досвідом у створенні секції завдань Research.

Тут багато що нагадує HTML, так як дослідницька бібліотека –
це відповідь Web-сервісу, форматований у вигляді XML-структури,
обумовленою Microsoft. Мені знадобилося близько двох днів на вивчення
схем, щоб відчути себе впевнено. Хоча секція завдань Research
Library
виглядає як вбудований браузер, вона не має його
гнучкістю. Поставити фоновий колір не можна, у вас дуже обмежений
контроль над розміткою тексту і зображень, немає сценаріїв, які
можна було б виконувати на стороні клієнта. Але навіть за таких
обмеження, як тільки ви зрозумієте можливості синтаксису, ви
виявите, що він дозволяє робити дуже багато чого.

Ще одна цікава річ. Вам доведеться навчитися працювати з екраном
обмеженого розміру. Зазвичай ви маєте справу з областю шириною 100-200
пікселів. Тобто доведеться економити місце. У принципі, це можна порівняти з
форматуванням тексту для PDA аналогічного форм-фактора.

Вигода від використання. NET Framework для Web-сервісів XML
полягає в потужній вбудованої підтримки кешування. Додавши наступний
атрибут до Web-методу Response(), Ми забезпечимо кешування рідко
мінливого відповіді на реєстрацію:

[WebMethod (CacheDuration = 86400)] / / кешувати на весь день,
/ / Оскільки дані змінюються рідко
/ / (86400 секунд = 24 годинах)
public string Registration(string registrationxml)

Я також застосував цей атрибут до методу Query() І встановив
термін кешування в одну годину, як показано в коді:

[WebMethod (CacheDuration = 3600)] / / кешувати на 1 годину
public string Query(string queryXml)

Як налагоджувати дослідницьку бібліотеку? Знову ж таки, її налагодження
корисно порівняти з налагодженням HTML в браузері, тільки в нашому випадку
браузер – це клієнт Office. Встановіть точки переривання в Web-методах,
які ви хочете налагодити, і запустіть проект з включеною налагодженням.
Visual Studio. NET запустить примірник Internet Explorer і переведе код
в режим налагодження. Залиште вікно Internet Explorer відкритим і
перейдіть в тестоване додаток Office. По мірі виконання
запитів у дослідницькій бібліотеці Visual Studio. NET буде
зупинятися на точках переривання.

І нарешті, кілька нескладних зауважень:

 


Кріс Куницький (Chris Kunicki) працює з замовниками, архітекторами і
інженерами над створенням вражаючих настільних, корпоративних і
Web-додатків в OfficeZealot.com. Кріс давно і з ентузіазмом займається
розробкою під Office і пропагує його важливість як платформи для
створення рішень. З ним можна зв'язатися за адресою
chris@officezealot.com.
Крім того, ви можете познайомитися з його точкою зору на сайті
http://www.officezealot.com.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*