Реализация нестандартного расширения 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 возвращает созданный фильтр, но все остальные методы также обязаны присутствовать.
[XmlRoot("TimeIntervals")] public class TimeIntervals: List<TimeInterval> { public TimeIntervals() { } public bool Check(DateTime Time) { foreach ( TimeInterval interval in this) if (interval.Check(Time)) return true; return false; } } }
Файлы сборки с расширениями WSE удобно поместить в глобальный кеш сборок GAC. Нижеследующий make файл создает и регистрирует сборку в GAC при команде nmake && nmake install.
# Файл: makefile all: Seva.WS.TimeAssertion.dll
Seva.WS.TimeAssertion.dll: TimeAssertion.cs TimeAssertion.key csc /t:library /out:Seva.WS.TimeAssertion.dll /keyfile:TimeAssertion.key /r:Microsoft.Web.Services3.dll TimeAssertion.cs
TimeAssertion.key: sn -k TimeAssertion.key
install: gacutil -nologo -i Seva.WS.TimeAssertion.dll`
Для использования данной политики нужно выполнить следующие действия.
1. Создать файл с допустимым местным временем использования веб службы, например такой.
<?xml version="1.0" encoding="utf-8"?> <TimeIntervals> <TimeInterval Inverse="true" From="09:00:00" To="20:00:00" /> <TimeInterval Inverse="false" From="13:00:00" To="13:30:00" /> </TimeIntervals> 2. Создать файл wse3policyCache.config на сервере со следующим содержанием (для простоты предполагается отсутствие иных политик, также следует указать реальное значение публичного ключа сборки с созданным расширением WSE).
<policies xmlns="http://schemas.microsoft.com/wse/2005/06/policy"> <extensions> <extension name="timeIntervals" type="Seva.WS.Assertions.TimeAssertion, Seva.WS.TimeAssertion, Version=1.0.0.0, Culture=neutral, PublicKeyToken=..." /> </extensions> <policy name="MyServicePolicy"> <timeIntervals file="C:\Inetpub\wwwroot\timeschema.config" /> </policy> </policy> </policies>
Вместо MyServicePolicy должно быть указано название политики, указанной в атрибуте Policy класса веб службы.
Содержание раздела
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий