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

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

Класс фильтра унаследован от 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 содержит метод проверки принадлежности времени заданному интервалу.

[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 &amp;&amp; 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 класса веб службы.