Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 是否有标准的方法使用属性来修改WCF操作的行为?_.net_Wcf_Attributes - Fatal编程技术网

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

.net 是否有标准的方法使用属性来修改WCF操作的行为?,.net,wcf,attributes,.net,Wcf,Attributes,我现在正在编写一些时髦的代码,我一直在想我是否可以使用属性来修改WCF操作的行为,比如让它执行额外的检查或跳过一些逻辑 例如,如果我们有以下请求信封: [MessageContract] public class UserRequest { [MessageBodyMember] public string SessionKey { get; set; } [MessageBodyMember] public UserModel User { get; set

我现在正在编写一些时髦的代码,我一直在想我是否可以使用
属性
来修改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
,它会拒绝呼叫(发送空的响应信封)或处理呼叫

当然,我可以在每个操作开始时添加检查代码,但这可能会很快重复,特别是当我处理大量操作时


我应该如何着手实现类似的东西呢?

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

IOperationBehavior要求您实现4种方法

  • ApplyDispatchBehavior()
  • AddBindingParameters()
  • ApplyClientBehavior()
  • 验证()
  • 你将完全控制沟通的每一部分。 您可以使用参数和消息检查器进行更精确的控制


    请参阅:了解更多信息。

    如果在每次服务操作之前都需要检查安全性或授权类型的内容,则可能需要实施自定义

    对于一般行为,您可以添加自定义或扩展


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

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

    • ServiceContractAttribute
      OperationContractAttribute
    • MessageContractAttriubte
      MessageHeaderAtriubte
      MessageBodyMemberAttribute
    • WebGetAttribute
      WebInvokeAttribute
    • ServiceBehaviorAttribute
      OperationBehaviorAttribute
      CallbackBehaviorAttribute
    • ServiceKnownTypeAttribute
      FaultContractAttriubte
    • DataContractFormatAttribute
      XmlSerializerFormatAttribute
    • TransactionFlowAttribute
      DeliveryRequirementsAttribute
    • AspNetCompatibilityRequirementsAttribute
    • 还有其他几个
    这些属性会影响WCF处理,但WCF还提供了具有多个注入点的大型扩展性模型,您可以通过在自定义属性中实现这些接口中的任意一个来添加自己的处理:

    • IServiceBehavior
      -影响整个服务
    • IEndpointBehavior
      -影响单个端点
    • IOperationBehavior
      -影响单个操作
    • IContractBehavior
      -影响单个服务或数据合约
    这些行为可以包含一些逻辑或添加一些其他更高级的自定义功能,如:

    • IParameterInspector
      -例如操作的自定义参数验证
    • IDispatchMessageFormatter
      -在服务器端处理序列化和反序列化
    • IClientMessageFormatter
      -在客户端处理序列化和反序列化
    • IDispatchMessageInspector
      -服务器端的消息修改或验证
    • IClientMessageInspector
      -在客户端修改或验证消息
    • IDispatchOperationSelector
      -选择在服务器端处理传入消息的操作
    • IClientOperationSelector
      -基于被调用的代理方法,可以从客户端选择要调用的不同操作
    • IOperationInvoker
      -调用操作-允许使用操作参数,例如添加未在消息中传递但存储在本地的其他参数
    • IErrorHandler
      -全局错误处理
    • IInstanceContextProvider
      -自定义实例上下文处理-如果要在WCF中实现自定义会话处理,则此基础
    • IInstanceProvider
      -自定义服务实例生存期处理
    • 还有其他的吗
    正如您所看到的,WCF的可扩展性非常大—IMHO和ASP.NET MVC是整个.NET框架中最好的(至少在我经常使用的部分中是这样)。此外,自定义行为只是WCF可扩展性的一部分。第二部分介绍自定义绑定和通道

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

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

    最后,如果您只需要一些自定义属性来向所选方法添加逻辑,那么它更像是AoP(面向方面编程)的场景,可以通过几个IoC(控制反转)容器(如MS Unity、Windsor Castle或Sprin)在WCF之外提供