| Россия, г. Новочеркасск |
Промежуточная среда веб служб 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 && 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 класса веб службы.