gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:09:39 25 4
gpt4 key购买 nike

我现在正在编写一些时髦的代码,我一直在想是否可以使用 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 key 是否存在于当前 HttpContext 中。也许相当于检查 HttpContext.Current.Session[request.SessionKey] != null ,为此它要么拒绝调用(发送一个空的响应信封)或处理它。

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

我应该如何实现此类内容?

最佳答案

WCF 服务本身使用属性只是检查类,如:

  • ServiceContractAttribute , OperationContractAttribute
  • MessageContractAttriubte , MessageHeaderAttriubte , MessageBodyMemberAttribute
  • WebGetAttribute , WebInvokeAttribute
  • ServiceBehaviorAttribute , OperationBehaviorAttribute , CallbackBehaviorAttriubte
  • ServiceKnownTypeAttribute , FaultContractAttriubte
  • DataContractFormatAttribute , XmlSerializerFormatAttribute
  • TransactionFlowAttribute , DeliveryRequirementsAttribute
  • AspNetCompatibilityRequirementsAttribute
  • 和其他几个

  • 这些属性会影响 WCF 处理,但 WCF 还提供具有多个注入(inject)点的大型可扩展性模型,您可以通过在自定义属性中实现这些接口(interface)中的任何一个来添加自己的处理:
  • IServiceBehavior - 影响整个服务
  • IEndpointBehavior - 影响单个端点
  • IOperationBehavior - 影响单个操作
  • IContractBehavior - 影响单个服务或数据契约(Contract)

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

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

    如果您想了解有关 WCF 可扩展性检查的更多信息
  • WCF Extensibility Samples
  • Carlos Figueira's blog 包含关于可扩展性的优秀文章

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

    最后,如果您只需要一些自定义属性来为选定的方法添加逻辑,那么它看起来更像是 AoP(面向方面​​的编程)的场景,可以在 WCF 之外通过多个 IoC(控制反转)容器(如 MS Unity、Windsor CaSTLe 或春网。另一种选择是纯 AoP 框架 - PostSharp。

    对于使用 Unity 的 AoP,您可以查看 Dino Esposito 来自 MSDN 杂志的几篇文章:
  • Aspect-Oriented Programming, Interception and Unity 2.0
  • Interceptors in Unity
  • Policy Injection in Unity

  • 对于 Spring.NET,只需检查他们的 excellent documentation 。我没有在 Windsor 中使用 AoP,但您会在 Internet 上找到大量文章。 PostSharp 是唯一提到的商业工具。它有一个功能集较小的免费版本,但您会发现您需要的功能只有商业版本。

    关于.net - 是否有使用属性来修改 WCF 操作行为的标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6615617/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com