Опубликован: 11.05.2007 | Доступ: свободный | Студентов: 1706 / 243 | Оценка: 4.36 / 4.25 | Длительность: 16:06:00
Лекция 9:

Промежуточная среда веб служб ASP.NET

Создание посредника веб службы

При использовании WSE 3.0 для создания посредника следует использовать утилиту WseWsdl3.exe. Она запускается следующим образом.

WseWsdl3.exe http://localhost/service.asmx?wsdl /type:webClient /out:proxy.cs

Утилита использует указанный URL WSDL описания службы и создаст на его основе файл proxy.cs с исходным текстом класса посредника, наследованного от Microsoft.Web.Services3.WebServicesClientProtocol. Описание веб сервиса на языке WSDL создается автоматически службой ASP.NET или иной системой веб служб. Поскольку файл c кодом посредника может быть создан заново в дальнейшем, в него не рекомендуется вносить какие либо изменения. Например, для связывания посредника с политикой WSE следует воспользоваться частичным описанием класса следующим образом.

[Policy("BankClientPolicy")]
public partial class BankService :
    Microsoft.Web.Services3.WebServicesClientProtocol 
{
}

Следует отметить, что, как и при применении утилиты xsd.exe для генерации кода по XML схеме, созданный посредник реализует не совсем тот же интерфейс, что исходный класс. Связано это с преобразованием типов данных CLR к типам данным XSD схем при создании описания интерфейса, и обратным преобразованием при создании посредника (рис. 7.5). В частности, как типизированные, так и нетипизированные списки класса службы в ее посреднике превращаются в массивы.

Создание посредника веб службы

Рис. 7.5. Создание посредника веб службы

Для каждого метода веб службы в посреднике создается пять публичных методов. Например, если служба имеет метод Transfer, то будут созданы следующие методы:

  • Transfer – для обычного вызова веб метода;
  • BeginTransfer и EndTransfer – для асинхронного вызова этого же метода через BeginInvoke / EndInvoke ;
  • TransferAsync (два метода) – для асинхронного вызова метода через InvokeAsync.

Разработчик может и самостоятельно использовать BeginInvoke / EndInvoke / InvokeAsync с аналогичным результатом, речь идет просто об экономии времени разработчика. В посреднике так же создается метод CancelAsync (один на каждый веб класс) для отмены вызовов удаленных методов через InvokeAsync.

Утилита WseWsdl3.exe поддерживает только работу с методами, имеющими единственный параметр или же не имеющими ни одного. Аналогичная по назначению стандартная утилита wsdl.exe из .NET SDK, не использующая WSE, не имеет такого ограничения. Данное ограничение следует считать оправданным и даже желательным для вызываемых удаленно методов, как объяснялось во второй главе данного курса.

7.4. Реализация нестандартного расширения WSE

В качестве примера использования расширяемой архитектуры веб служб на основе ASP.NET представлено расширение WSE, которое ограничивает доступ к веб службе некоторым интервалом времени (например только с 10 часов вечера до 8 утра). Данному расширению достаточно создать единственный фильтр SOAP – входящий фильтр сервера. Далее приведен исходный текст сборки с расширением, унаследованным от абстрактного класса Microsoft.Web.Services3.Design.PolicyAssertion.

// TimeAssertion.cs
using System;
using System.IO;
using System.Reflection;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;

using Microsoft.Web.Services3;
using Microsoft.Web.Services3.Design;
using Microsoft.Web.Services3.Security;

[assembly:AssemblyVersionAttribute("1.0.0.0")]

namespace Seva.WS.Assertions
{   
    public class TimeAssertion: PolicyAssertion
    {
        private TimeIntervals intervals;
        public TimeAssertion(): base()
        {
            intervals = null;
        }

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

public override void ReadXml(XmlReader reader, 
    IDictionary<string, Type> extensions)
{
    string fileName = reader.GetAttribute("file");
    if (fileName == null)
throw new Exception("Attribute 'file' not found in policy");
    
    // Обязательная операция - переход к следующему тегу в файле политики,
    // иначе данный элемент будет читаться бесконечно
    reader.Read();

    // Чтение файла с интервалами времени доступности службы 
    using (StreamReader timeReader = new StreamReader(fileName))
    {
XmlSerializer serializer = new
    XmlSerializer(typeof(TimeIntervals));
intervals = (TimeIntervals) serializer.Deserialize(
     new XmlTextReader(timeReader));
    }
}

Методы Create....Filter отвечают за создание экземпляров фильтров SOAP, которые будут встроены в трубопровод фильтров. В данном примере только метод CreateServiceInputFilter возвращает созданный фильтр, но все остальные методы также обязаны присутствовать.

public override SoapFilter CreateClientInputFilter(
    FilterCreationContext context)
{    
    return null;
}

public override SoapFilter CreateClientOutputFilter(
    FilterCreationContext context)
{
    return null;
}

public override SoapFilter CreateServiceInputFilter(
    FilterCreationContext context)
{
    return new CheckTimeFilter(intervals, context);
}

public override SoapFilter CreateServiceOutputFilter(
    FilterCreationContext context)
{
    return null;
}
    }