是否有标准方法使用属性来修改WCF操作的行为方式?

时间:2011-07-07 18:52:48

标签: .net wcf attributes

我正在研究一些时髦的代码,我一直想知道我是否可以使用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 个答案:

答案 0 :(得分:6)

WCF服务本身使用属性只需检查类:

  • ServiceContractAttributeOperationContractAttribute
  • MessageContractAttriubteMessageHeaderAttriubteMessageBodyMemberAttribute
  • WebGetAttributeWebInvokeAttribute
  • ServiceBehaviorAttributeOperationBehaviorAttributeCallbackBehaviorAttriubte
  • ServiceKnownTypeAttributeFaultContractAttriubte
  • DataContractFormatAttributeXmlSerializerFormatAttribute
  • TransactionFlowAttributeDeliveryRequirementsAttribute
  • AspNetCompatibilityRequirementsAttribute
  • 和其他几个人

这些属性会影响WCF处理,但WCF还提供了具有多个注入点的大型可扩展性模型,您可以通过在自定义属性中实现任何这些接口来添加自己的处理:

  • IServiceBehavior - 影响整体服务
  • IEndpointBehavior - 影响单个端点
  • IOperationBehavior - 影响单一操作
  • IContractBehavior - 影响单一服务或数据合同

这些行为可以包含一些逻辑或添加一些其他更高级的自定义功能,如:

  • IParameterInspector - 例如操作的自定义参数验证
  • IDispatchMessageFormater - 处理服务器端的序列化和反序列化
  • IClientMessageFormater - 处理客户端的序列化和反序列化
  • IDispatchMessageInspector - 服务器端的消息修改或验证
  • IClientMessageInspector - 客户端的消息修改或验证
  • IDispatchOperationSelector - 选择处理服务器端传入消息的操作
  • IClientOperationSelector - 基于调用的代理方法可以选择从客户端调用的不同操作
  • IOperationInvoker - 调用操作 - 允许使用操作参数,例如添加未在消息中传递但在本地存储的其他参数
  • IErrorHandler - 全局错误处理
  • IInstanceContextProvider - 自定义实例上下文处理 - 如果要在WCF中实现自定义会话处理的基础
  • IInstanceProvider - 自定义服务实例生存期处理
  • 任何其他人

正如您所看到的,WCF的可扩展性非常大 - 使用ASP.NET MVC的IMHO在整个.NET框架中是最好的(至少在我经常使用的部分中)。此外,自定义行为只是WCF可扩展性的一部分。第二部分涉及自定义绑定和通道。

如果您想了解有关WCF可扩展性检查的更多信息

但这是你需要的吗?首先检查现有属性,如果他们已经为您提供了您正在寻找的功能。接下来考虑会话 - 通常不向WCF服务提供ASP.NET会话。您必须打开AspNetCompatibility,然后您将WCF服务降级为ASMX服务。即便如此,您可能会遇到ASP.NET会话问题,因为有关会话的信息是在cookie中传输的,默认情况下WCF不会使用它们。

最后如果你只需要一些自定义属性来为所选方法添加逻辑,那么它更像是AoP(面向方面​​编程)的场景,可以通过几个IoC(控制反转)容器(如MS Unity)在WCF之外提供。温莎城堡或Spring.NET。另一个选择是纯AoP框架 - PostSharp。

对于使用Unity的AoP,您可以查看来自MSDN杂志的Dino Esposito的几篇文章:

对于Spring.NET,只需检查他们的excellent documentation。我没有在温莎使用AoP,但你会在网上找到很多文章。 PostSharp是唯一提到的商业广告工具。它有一个功能较小的免费版本,但你可以发现你需要的功能只是商业版本。

答案 1 :(得分:0)

是。您需要创建实现IOperationBehavior和Attribute的自定义操作行为。

IOperationBehavior要求您实现4种方法。

  1. ApplyDispatchBehavior()
  2. AddBindingParameters()
  3. ApplyClientBehavior()
  4. 验证()
  5. 您将完全控制通信的每个部分。 您可以使用参数和消息检查器进行更精确的控制。

    请参阅:IOperationBehavior Interface了解更多信息。

答案 2 :(得分:0)

在每个服务操作之前,您要检查安全性或授权类型的内容,然后您可能希望实现自定义System.ServiceModel.ServiceAuthorizationManager

对于一般行为事物,您可以添加自定义IEndpointBehaviorIOperationBehavior扩展名。

如果您真的想控制所有内容,可以实现自定义IServiceInvokerExtension,您可以在其中检查调用自定义属性的方法,并在实际服务方法调用之前/之后调用自定义方法(如假AOP)。