.net 有没有一种标准的方法可以使用属性来修改WCF操作的行为?

g6baxovj  于 2023-03-31  发布在  .NET
关注(0)|答案(3)|浏览(108)

我现在正在写一些奇怪的代码,我一直在想是否可以使用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的东西,它要么拒绝调用(发送一个空的响应信封),要么处理它。
当然,我可以在每个操作的开始添加检查代码,但是这会很快变得非常重复,特别是当我处理很多操作时。
我应该如何着手实施这类事情呢?

mu0hgdu0

mu0hgdu01#

WCF服务在本地使用属性,只检查类,如:

  • 一个月一次,一个月一次
  • MessageContractAttriubteMessageHeaderAttriubteMessageBodyMemberAttribute
  • WebGetAttributeWebInvokeAttribute
  • ServiceBehaviorAttributeOperationBehaviorAttributeCallbackBehaviorAttriubte
  • ServiceKnownTypeAttribute,x1米11英寸1x
  • 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是整个.NET框架中最好的(至少在我经常使用的部分中)。此外,自定义行为只是WCF可扩展性的一部分。第二部分处理自定义绑定和通道。
如果你想知道更多关于WCF可扩展性检查

但是这是你所需要的吗?首先检查现有的属性,如果它们已经为你提供了你正在寻找的功能。接下来想想会话- ASP.NET会话通常不提供给WCF服务。你必须打开AspNetCompatibility,之后你将把WCF服务降级为ASMX服务。即使在这之后,你也可能会遇到ASP.NET会话的问题。NET会话中,因为有关会话的信息是在cookie中传输的,而WCF默认情况下不使用它们。
最后,如果你只需要一些自定义属性来为选定的方法添加逻辑,它看起来更像是AoP(面向方面编程)的场景,可以通过几个IoC(控制反转)容器(如MS Unity,温莎Castle或Spring .NET)在WCF之外提供。
对于使用Unity的AoP,您可以查看Dino Esposito从MSDN杂志上发表的几篇文章:

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

jdg4fx2g

jdg4fx2g2#

是,需要创建实现IOperationBehavior和Attribute的自定义操作行为。
IOperationBehavior要求您实现4个方法。

  1. ApplyDispatchBehavior()
  2. AddBindingParameters()
  3. getString()
    1.验证()
    您将完全控制通信的每一部分。您可以使用参数和消息检查器进行更精确的控制。
    请参阅:IOperationBehavior Interface了解更多信息。
kx5bkwkv

kx5bkwkv3#

如果在每个服务操作之前都需要检查安全性或授权类型,那么您可能需要实现自定义System.ServiceModel.ServiceAuthorizationManager
对于一般的行为,您可以添加自定义IEndpointBehaviorIOperationBehavior扩展。
如果你真的想控制一切,你可以实现一个自定义的IServiceInvokerExtension,在其中你可以检查被调用的方法的自定义属性,并在实际的服务方法调用之前/之后调用自定义方法(就像一个假的AOP)。

相关问题