Разработка распределенных приложений в Microsoft.NET Framework



         

Реализация нестандартного расширения WSE - часть 2


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; } }

Класс фильтра унаследован от Microsoft.Web.Services3.SoapFilter и хранит в себе список разрешенных интервалов. Это не лучшее решение, но оно позволяет сократить пример и не привязывать его к использованию баз данных.

public class CheckTimeFilter : SoapFilter { private TimeIntervals intervals; public CheckTimeFilter(TimeIntervals intervals, FilterCreationContext context) { this.intervals = intervals; }

ProcessMessage – основной метод класса, обрабатывающий пакет SOAP. В данном примере в нем нет нужды анализировать содержимое пакета SoapEnvelope.

public override SoapFilterResult ProcessMessage(SoapEnvelope envelope) { if (! intervals.Check(DateTime.Now)) throw new Exception("Service is unavailable now."); return SoapFilterResult.Continue; } }

Класс TimeInterval содержит в себе интервал времени в течении суток. Тип TimeSpan, в отличие от DateTime, не относится к примитивным и не может быть напрямую сохранен в атрибуте XML, поэтому приходится использовать некоторый обходной путь для автоматической сериализации объекта этого класса в строку удобного вида, такую как следующая.

<TimeInterval Inverse="false" From="09:00:00" To="10:30:00" />

Для сериализации в указанный вид можно либо реализовать чтение из XML самостоятельно, либо использовать дополнительные свойства сдля XML сериализации.

[Serializable] public class TimeInterval { [XmlAttribute("From")] public string FromField { set {From = TimeSpan.Parse(value);} get {return From.ToString();} } [XmlAttribute("To")] public string ToField { set {To = TimeSpan.Parse(value);} get {return To.ToString();} } [XmlAttribute("Inverse")] public bool Inverse; [XmlIgnore] public TimeSpan From; [XmlIgnore] public TimeSpan To; public bool Check(DateTime Time) { bool result = (From <= Time.TimeOfDay) && (Time.TimeOfDay <= To); if (Inverse) result = ! result; return result; } }

Класс TimeIntervals содержит метод проверки принадлежности времени заданному интервалу.




Содержание  Назад  Вперед