Опубликован: 04.05.2010 | Доступ: свободный | Студентов: 4032 / 454 | Оценка: 4.64 / 4.44 | Длительность: 41:24:00
Лекция 11:

Применение Веб-методов. Технология Jasp

14.1.4. Создание Веб-сервиса

Веб-сервисы создаются в управляемом коде с помощью платформы ASP.NET. Сначала создается файл с расширением ASMX [7]. Этот файл содержит класс, помеченный атрибутом WebService, который служит для обозначения открытого класса, реализующего логику Веб-сервиса. Этот класс Веб-сервиса содержит один или несколько открытых методов, подлежащих публикации в составе Веб-сервиса. Перед этими методами ставится атрибут WebMethod. Среда ASP.NET отвечает за реализацию инфраструктуры публикации этих методов в составе Веб-сервиса.

Веб-сервисы состоят из двух частей: точка входа Веб-сервиса и код, который реализует его функциональность. В ASP.NET точкой входа для Веб-сервиса служит текстовый ASMX-файл. Он ссылается на код в предкомпилированных сборках, файл с выделенным кодом, или на код, содержащийся в самом ASMX-файле.

При построении Веб-сервиса в управляемом коде среда ASP.NET автоматически обеспечивает инфраструктуру и обрабатывает запросы и ответы Веб-сервиса, в том числе занимаясь разбором и формированием сообщений SOAP.

14.1.4.1. Директива обработки WebService

В начале ASMX- страницы находится директива обработки WebService, атрибуты которой содержат сведения о реализации Веб-сервиса. Эта директива предоставляет среде ASP.NET необходимые сведения, например, о том, какой класс реализует функциональность. Ниже приведен пример директивы обработки WebService:

<%@ WebService Language="c#" Codebehind="Service1.asmx.cs"
    Class="WebService1.Service1" %>

Атрибут Language указывает, какой язык программирования использовался для разработки сервиса. Веб-сервис можно разрабатывать на любом языке, совместимом с .NET – например, на Visual Basic .NET или на Visual C#.

При создании сервиса в управляемом коде с использованием Visual Studio .NET ее реализация находится в файле с выделенным кодом. Файл с выделенным кодом связывается с ASMX- страницей посредством атрибута Codebehind.

При использовании шаблона сервиса ASP.NET атрибут Class указывает, какой класс в файле с выделенным кодом реализует функциональные возможности сервиса.

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

14.1.5. Выполнение HTTP-запросов из клиентского сценария AJAX

Прежде чем обсуждать, каким образом можно использовать прокси-классы для вызова Веб-методов, рассмотрим, как можно решить ту же задачу при помощи класса WebRequest. Этим может потребоваться, если необходимо управлять уровнем связи или выполнять проверку данных, отправляемых на или с сервера, или если заранее не известны параметры самого сервиса.

В следующем примере показаны способы использования объекта WebRequest для реализации Веб-запросов GET и POST при подключении к указанным URL-адресам (конечные точки HTTP):

var resultElement;
function pageLoad()
{
    resultElement = $get("ResultId");
}
// Эта функция вызывает GET запрос.
function GetWebRequest()
{
    // Создаем объект WebRequest.
    var wRequest = new Sys.Net.WebRequest();
    // Указываем адрес.      
    wRequest.set_url("getTarget.htm");
    alert("Target Url: getTarget.htm");
    // Указываем команду.
    wRequest.set_httpVerb("GET");
    // Указываем-callback функцию.
    wRequest.add_completed(OnWebRequestCompleted);
    // Очищаем содержимое элемента, который будет использоваться для вывода результата.
    resultElement.innerHTML = "";
    // Вызываем запрос.
    wRequest.invoke();  
}
// Эта функция вызывает POST запрос.
function PostWebRequest()
{
    // Создаем объект WebRequest.
    var wRequest = new Sys.Net.WebRequest();
    // Указываем адрес.      
    wRequest.set_url("postTarget.aspx");
    alert("Target Url: postTarget.aspx");
    // Указываем команду.
    wRequest.set_httpVerb("POST");
    // Указываем обработчик запроса.
    wRequest.add_completed(OnWebRequestCompleted);
    // Указываем тело POST.
    var requestBody = "Message=Привет, Мир!";
    wRequest.set_body(requestBody);
    wRequest.get_headers()["Content-Length"] = requestBody.length;
    // Очищаем содержимое элемента, который будет использоваться для вывода результата.   
    resultElement.innerHTML = "";
    // Вызываем запрос.
    wRequest.invoke();              
}
// Эта функция вызывается асинхронно, когда завершится запрос.
function OnWebRequestCompleted(executor, eventArgs) 
{    
    if(executor.get_responseAvailable()) 
    {
        // Отобразим статус запроса. 
       resultElement.innerHTML +=
          "Status: [" + executor.get_statusCode() + " " + 
                    executor.get_statusText() + "]" + "<br/>";
        // Отобразим заголовки запроса.
       resultElement.innerHTML += "Headers: ";
       resultElement.innerHTML += executor.getAllResponseHeaders() + "<br/>";
        // Отобразим тело запроса.
       resultElement.innerHTML += "Body:";
      if(document.all)
        resultElement.innerText += executor.get_responseData();
      else
        resultElement.textContent += executor.get_responseData();
    }
}
if (typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded();

В табл. 11.1 перечислены основные классы, связанные с Веб-сервисами, которые можно вызвать из клиентского сценария.

Таблица 14.1. Пространства имен для клиента
Имя Описание
Пространство имен Sys.Net Содержит классы, управляющие взаимодействием между клиентскими приложениями AJAX в ASP.NET и Веб-службами на сервере. Пространство имен Sys.Net является частью Microsoft AJAX (библиотека).
Пространство имен Sys.Serialization Содержит классы, связанные с сериализацией данных для клиентских приложений AJAX в ASP.NET.
Пространство имен Sys.Services Содержит типы, которые обеспечивают доступ сценариев клиентских приложений AJAX в ASP.NET к службе проверки подлинности, службе профилей и другим службам приложения ASP.NET. Пространство имен Sys.Services является частью Microsoft AJAX (библиотека).

В табл. 11.2 перечислены основные классы, связанные с Веб-сервисами, которые можно вызвать на сервере.

Таблица 14.2. Пространства имен для сервера
Имя Описание
System.Web.Script.Serialization Содержит классы, обеспечивающие сериализацию в формат JSON и десериализацию из этого формата для управляемых типов. Также обеспечивает расширенные возможности для настройки сериализации.

14.1.6. Предоставление доступа к Веб-службам в клиентском сценарии

Более удобный способ вызова Веб-сервисов заключается в использовании прокси-классов [8]. Как уже отмечалось, ASP.NET автоматически создаются прокси-классы JavaScript для Веб-служб. Эти прокси-классы являются производными от класса Sys.Net.WebServiceProxy. Чтобы вызвать метод Веб-сервиса, следует вызвать соответствующий метод прокси-класса JavaScript.

Из сценария можно предоставить доступ к Веб-службе, которая представлена файлом с расширением ASMX и класс которой определен с использованием атрибута ScriptServiceAttribute. Отдельные методы, вызываемые из сценария, должны быть дополнены атрибутом WebMethodAttribute.

В следующем примере показан порядок использования этих атрибутов в коде Веб-службы:

[ScriptService]
public class SimpleWebService : System.Web.Services.WebService
{
[WebMethod]
public string EchoInput(String input)
{
    // Здесь расположен код метода.
}
}

Чтобы разрешить вызов Веб-служб из сценария, следует зарегистрировать обработчик HTTP ScriptHandlerFactory в файле Web.config приложения. Этот обработчик используется для обработки вызовов Веб-служб из сценария. В следующем примере показан элемент файла Web.config, определяющий добавление обработчика:

<system.web>
  <httpHandlers>
    <remove verb="*" path="*.asmx"/>
    <add verb="*" path="*.asmx"
      type="System.Web.Script.Services.ScriptHandlerFactory"
       validate="false"/>
  </httpHandlers>
<system.web>

Вызовы Веб-служб, выполненные не из сценария ASP.NET AJAX, обработчик ScriptHandlerFactory делегирует используемому по умолчанию обработчику, в котором вместо формата JSON используется SOAP. Делегирование выполняется автоматически. Какие-либо дополнительные действия следует выполнять только в том случае, если требуется запретить использование протокола SOAP в Веб-службах. В этом случае в файле Web.config необходимо определить следующие параметры конфигурации:

<system.web>
  <webServices>
    <protocols>
      <clear/>
    </protocols>
  </webServices>
</system.web>
14.1.6.1. Предоставление доступа к сервисам из клиентского сценария на Веб-странице ASP.NET

Чтобы разрешить вызов Веб-служб (ASMX) из клиентского сценария на Веб- странице ASP.NET, необходимо добавить на страницу элемент управления ScriptManager. Чтобы определить ссылку на Веб-службу, необходимо добавить дочерний элемент asp:ServiceReference к элементу управления ScriptManager. После этого необходимо установить URL-адрес Веб-службы в качестве значения атрибута ссылки на сервер path. Объект ServiceReference определяет необходимость создания прокси-класса JavaScript для вызова указанной Веб-службы в ASP.NET.

Добавим в начало страницы первым элементом формы объект ScriptManager:

<asp:ScriptManager ID="Scriptmanager1" runat="server">
<Services>
    <asp:ServiceReference Path="~/SimpleWebService.asmx" />
</Services>
</asp:ScriptManager>

Объект ServiceReference может ссылаться на Веб-службу только в том же домене, в котором находится страница. Путь Веб-службы может быть относительным, относительным к приложению, относительным к домену или абсолютным. При использовании абсолютного пути следует убедиться, что он указан в том же домене.

При отображении страницы, содержащей этот элемент управления ScriptManager, для Веб-службы SimpleWebService.asmx создается прокси-класс JavaScript. В прокси-классе реализуются методы, соответствующие методам Веб-службы SimpleWebService.asmx. Страница также содержит прокси-классы JavaScript, соответствующие типам данных сервера, которые используются в качестве входных параметров или возвращаемых значений методов Веб-служб. Это позволяет написать клиентский сценарий, инициализирующий эти параметры, и передать их вызову метода.

Свойство InlineScript объекта ServiceReference определяет порядок включения прокси-класса JavaScript на странице. Если для свойства InlineScript установлено значение false (используется по умолчанию), получение сценария прокси-класса выполняется с помощью отдельного запроса. Этот параметр рекомендуется использовать в том случае, если несколько страниц ссылаются на одну службу и включено кэширование.

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

Вызов метода Веб-сервисы из сценария осуществляется асинхронным способом. Чтобы получить возвращаемое значение или определить факт возврата запроса, следует определить функцию обратного вызова при успешном выполнении запроса. Функция обратного вызова вызывается при успешном выполнении запроса и содержит значение (если есть), возвращаемое в результате вызова метода Веб-сервиса. Также можно определить функцию обратного вызова при неудачном завершении запроса, используемую для обработки ошибок. Кроме того, можно передать в функции обратного вызова сведения о контексте пользователя. Если метод Веб-сервиса возвращает сложный тип, функция обратного вызова при успешном выполнении запроса принимает возвращаемое значение в форме объекта JavaScript, соответствующего типу сервера.