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

Ric*_*gan 3 .net wcf attributes

我现在正在研究一些时髦的代码,我一直想知道我是否可以attributes用来修改WCF操作的行为,比如可能让它执行额外的检查或者让它跳过一些逻辑.

例如,如果我们有以下请求信封:

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

    [MessageBodyMember]
    public UserModel User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以及以下服务操作:

[ForceSession]
void AddUser ( UserRequest request ) 
{
}

void EditUser ( UserRequest request )
{
}
Run Code Online (Sandbox Code Playgroud)

我们可以在AddUser操作上有一些自动功能,检查请求的会话密钥是否存在于当前HttpContext.也许相当于检查的东西HttpContext.Current.Session[request.SessionKey] != null,它要么拒绝呼叫(发送一个空的响应信封),要么处理它.

当然,我可以在每个操作开始时添加检查代码,但这可以非常快速地重复,特别是如果我正在处理大量操作.

我应该如何实施某种类型的东西?

Lad*_*nka 7

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 - 自定义服务实例生存期处理
  • 任何其他人

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

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

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

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

对于AoP with Unity,您可以查看MSDN杂志的Dino Esposito撰写的几篇文章:

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