繁体   English   中英

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

[英]Is there a standard way to use attributes to modify how WCF operations behave?

我现在正在编写一些时髦的代码,我一直在想是否可以使用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操作上有一些自动功能,检查请求的 session 键是否存在于当前HttpContext中。 可能相当于检查HttpContext.Current.Session[request.SessionKey] != null ,为此它要么拒绝呼叫(发送一个空的响应信封)或处理它。

当然,我可以在每个重要的操作开始时添加检查代码,但这可能会很快重复,尤其是在我处理大量操作的情况下。

我应该如何 go 来实现类似的东西?

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

  • ServiceContractAttributeOperationContractAttribute合同属性
  • MessageContractAttriubte , MessageHeaderAttriubte , MessageBodyMemberAttribute
  • WebGetAttribute , WebInvokeAttribute
  • ServiceBehaviorAttributeOperationBehaviorAttribute行为属性、 CallbackBehaviorAttriubte行为属性
  • ServiceKnownTypeAttribute , FaultContractAttriubte
  • DataContractFormatAttribute , XmlSerializerFormatAttribute
  • TransactionFlowAttribute , DeliveryRequirementsAttribute
  • AspNetCompatibilityRequirementsAttribute
  • 和其他几个

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

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

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

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

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

如果您想了解更多关于 WCF 扩展性检查

但这是你需要的吗? 首先检查现有属性是否已经为您提供了您正在寻找的功能。 接下来想想 session - ASP.NET session 是不正常提供给 ZFB608636129CB469B63E521 服务的。 您必须打开 AspNetCompatibility,然后您将 WCF 服务降级为 ASMX 服务。 Even after that you can have problems with ASP.NET session because the information about session is transferred in cookie and WCF by default doesn't use them.

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

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

对于 Spring.NET,只需查看其出色的文档即可。 我没有在 Windsor 中使用 AoP,但您会在 Internet 上找到很多文章。 PostSharp 是唯一提到的商业工具。 它有一个功能集较小的免费版本,但您会发现您需要的功能仅在商业版本中。

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

IOperationBehavior 要求您实现 4 种方法。

  1. 应用调度行为()
  2. 添加绑定参数()
  3. 应用客户端行为()
  4. 证实()

您将完全控制通信的每个部分。 您可以使用参数和消息检查器进行更精确的控制。

更多信息请参考: IOOperationBehavior 接口

在每次服务操作之前,您都需要检查安全或授权类型的东西,那么您可能需要实现自定义System.ServiceModel.ServiceAuthorizationManager

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM