Существует ли стандартный способ использования атрибутов для изменения поведения операций WCF? - PullRequest
3 голосов
/ 07 июля 2011

Я сейчас работаю над каким-то прикольным кодом, и мне было интересно, могу ли я использовать attributes, чтобы изменить поведение WCF-операции, например, заставить ее выполнить дополнительную проверку или пропустить некоторую логику.

Например, если бы у нас был следующий конверт запроса:

[MessageContract]
public class UserRequest 
{
    [MessageBodyMember]
    public string SessionKey { get; set; }

    [MessageBodyMember]
    public UserModel User { get; set; }
}

и следующие сервисные операции:

[ForceSession]
void AddUser ( UserRequest request ) 
{
}

void EditUser ( UserRequest request )
{
}

, мы могли бы иметь некоторые автоматические функции наAddUser операция, которая проверяет, существует ли ключ сеанса запроса в текущем HttpContext.Возможно, что-то эквивалентное проверке HttpContext.Current.Session[request.SessionKey] != null, для чего он либо отклоняет вызов (отправляет пустой конверт ответа), либо обрабатывает его.

Конечно, я мог бы просто добавить проверочный код в началекаждая операция, где они имеют значение, но это может стать довольно повторяющимся довольно быстро, особенно если я работаю с большим количеством операций.

Как мне поступить с реализацией чего-то подобного?

Ответы [ 3 ]

7 голосов
/ 07 июля 2011

Службы WCF изначально используют атрибуты, просто проверяйте классы, такие как:

  • ServiceContractAttribute, OperationContractAttribute
  • MessageContractAttriubte, MessageHeaderAttriubte, MessageBodyMemberAttribute
  • WebGetAttribute, WebInvokeAttribute
  • ServiceBehaviorAttribute, OperationBehaviorAttribute, CallbackBehaviorAttriubte
  • ServiceKnownTypeAttribute, FaultContractAttriubte
  • DataContractFormatAttribute, XmlSerializerFormatAttribute
  • TransactionFlowAttribute, DeliveryRequirementsAttribute
  • AspNetCompatibilityRequirementsAttribute
  • и ряд других

Эти атрибуты влияют на обработку WCF, но также WCFпредлагает большую модель расширяемости с несколькими точками внедрения, где вы можете добавить свою собственную обработку, внедрив любой из этих интерфейсов в пользовательский атрибут:

  • IServiceBehavior - влияет на весь сервис
  • IEndpointBehavior- влияет на одну конечную точку
  • IOperationBehavior - влияет на одну операцию
  • IContractBehavior - влияет на одну услугу или контракт данных

Эти поведения могут содержать некоторую логику или добавитьнекоторые другие более продвинутые пользовательские функции, такие как:

  • IParameterInspector - например, проверка пользовательских параметров для операции
  • IDispatchMessageFormater - работа с сериейЛизинг и десериализация на стороне сервера
  • IClientMessageFormater - работа с сериализацией и десериализацией на стороне клиента
  • IDispatchMessageInspector - модификация или проверка сообщений на стороне сервера
  • IClientMessageInspector- изменение или проверка сообщения на стороне клиента
  • IDispatchOperationSelector - выбор операции обработки входящего сообщения на стороне сервера
  • IClientOperationSelector - на основе вызываемого прокси-метода можно выбрать другую операцию для вызовасо стороны клиента
  • IOperationInvoker - вызов операции - позволяет работать с параметрами операции и, например, добавлять другие параметры, которые не были переданы в сообщении, но хранятся локально
  • IErrorHandler -обработка глобальных ошибок
  • IInstanceContextProvider - обработка контекста настраиваемого экземпляра - основа, если вы хотите реализовать настраиваемую обработку сеанса в WCF
  • IInstanceProvider - обработка срока действия настраиваемого экземпляра службы
  • any any any

Как видите, расширяемость WCF довольно велика - ИМХО с ASP.NET MVC лучший в целом .NET Framework (по крайней мере, среди частей, которые я регулярно использую).Более того, пользовательское поведение - это только одна часть расширяемости WCF.Вторая часть касается пользовательских привязок и каналов.

Если вы хотите узнать больше о проверке расширяемости WCF

Но это то, что вам нужно?Сначала проверьте существующие атрибуты, если они уже предлагают вам функциональность, которую вы ищете.Теперь подумайте о сессии - сессия ASP.NET обычно не предоставляется службе WCF.Вы должны включить AspNetCompatibility, после чего вы переведите службу WCF в службу ASMX.Даже после этого у вас могут возникнуть проблемы с сеансом ASP.NET, потому что информация о сеансе передается в cookie, а WCF по умолчанию их не использует.

Наконец, если вам нужны только некоторые пользовательские атрибуты для добавления логики вдля выбранных методов это больше похоже на сценарий для AoP (аспектно-ориентированного программирования), который может быть предложен за пределами WCF через несколько контейнеров IoC (инверсия управления), таких как MS Unity, Windsor Castle или Spring.NET.Другой вариант - чистый фреймворк AoP - PostSharp.

Для AoP с Unity вы можете проверить несколько статей Дино Эспозито из журнала MSDN:

Для Spring.NET простопроверьте их отличная документация .Я не использовал AoP с Windsor, но вы найдете множество статей в Интернете.PostSharp - единственный упомянутый инструмент, который является коммерческим.Он имеет бесплатную версию с меньшим набором функций, но вы можете обнаружить, что нужные вам функции есть только в коммерческой версии.

0 голосов
/ 07 июля 2011

если есть вещи типа безопасности или авторизации, которые вы хотите проверять перед каждой операцией службы, тогда вы можете захотеть реализовать пользовательский System.ServiceModel.ServiceAuthorizationManager

Для общих поведенческих вещей вы можете добавить собственное IEndpointBehavior или IOperationBehavior расширение.

Если вы ДЕЙСТВИТЕЛЬНО хотите контролировать все, вы можете реализовать пользовательский IServiceInvokerExtension, в котором вы можете проверить вызываемый метод на наличие пользовательских атрибутов и вызывать пользовательские методы до / после фактического вызова метода службы (например, поддельной AOP ).

0 голосов
/ 07 июля 2011

Да.Вам необходимо создать пользовательское поведение операции, реализующее IOperationBehavior и Attribute.

IOperationBehavior требует, чтобы вы реализовали 4 метода.

  1. ApplyDispatchBehavior ()
  2. AddBindingParameters ()
  3. ApplyClientBehavior ()
  4. Validate ()

Вы будете иметь полный контроль над каждой частью связи.Вы можете использовать инспекторы параметров и сообщений для более точного управления.

См. Интерфейс IOperationBehavior для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...