Один из способов достижения таможенной проверки - это услуга decorator. Рассмотрим следующий код:
[ServiceContract]
public interface IService
{
[OperationContract]
string GetData(int value);
}
public class Service : IService
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
}
public class ServiceValidationDecorator : IService
{
private readonly IService m_DecoreatedService;
public ServiceValidationDecorator(IService decoreated_service)
{
m_DecoreatedService = decoreated_service;
}
public string GetData(int value)
{
IncomingWebRequestContext request = WebOperationContext.Current.IncomingRequest;
WebHeaderCollection headers = request.Headers;
//Here use the headers to do you custom validation
bool valid = ...
if(!valid)
throw new SecurityException("Access Denied");
return m_DecoreatedService.GetData(value);
}
}
Здесь контракт WCF является IService, и оригинальное выполнение сервис класса Service.
Класс ServiceValidationDecorator - это декоратор, который выполняет выборочную проверку, а затем передает запрос другой службе.
Теперь вместо размещения класса Service необходимо разместить класс ServiceValidationDecorator.
WCF собирается пожаловаться на то, что ServiceValidationDecorator не имеет конструктора без параметров. Правильный способ исправить это, чтобы создать пользовательский экземпляр поставщика (взглянуть на this), а затем построить объект ServiceValidationDecorator (в пределах провайдера экземпляра), как это:
new ServiceValidationDecorator(new Service())
Если вы хотите быстро обходной путь только чтобы быстро протестировать это, просто создайте класс Service в конструкторе ServiceValidationDecorator (это на самом деле плохой дизайн).
Если у вас есть много услуг, и вы не хотите создавать декоратор для каждой службы, посмотрите на Aspect Oriented Programming (AOP). Найдите PostSharp или DynamicProxy.
Вам нужно сделать это так? (то есть посредством поведения операции)? Вы не можете использовать декоратор? Или, может быть, AOP-аспект? –
Я не знаю ни одного из трех способов. Пожалуйста, предоставьте мне ссылку, чтобы прочитать об этом. –