【问题标题】:Can I Hook into any WCF events just prior to operation method call?我可以在操作方法调用之前挂钩任何 WCF 事件吗?
【发布时间】:2014-08-13 18:30:36
【问题描述】:

我正在使用 IPropertyInspector 验证提供的令牌并获取相应的用户配置文件(如果找不到令牌或令牌无效,我会抛出错误异常)。然后我按照这个建议的实现将此用户配置文件存储在 OperationContext 中:(Where to store data for current WCF call? Is ThreadStatic safe?)

在我的服务实现类中,我希望用户配置文件是一个我可以轻松访问的字段,所以我的第一个想法是在构造函数中填充这个字段,但不幸的是服务类在 之前 IPropertyInspector 触发。因此,作为替代方案,我是否可以在 WCF 管道中订阅一些事件,该事件发生在 IPropertyInspector 运行之后,但在我的服务上的操作被调用之前,我可以从操作上下文中填充这个用户配置文件字段?

如果没有,我会在每次需要时使用 RemoteRequestContext.Current.Items["User"] as UserProfile,但字段会更简洁、更方便。

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    您可以实现 Attribute、IServiceBehavior 和 IDispatchMessageInspector 接口,并在 ApplyDispatchBehavior() 方法中调用您的方法。它将在每次执行任何操作方法之前执行。您刚刚在 Internet 上阅读了有关 Attribute、IServiceBehavior 和 IDispatchMessageInspector 的信息。如果你在这里没有得到任何评论,我会给你一些源代码。

    【讨论】:

    • 感谢您的建议。鉴于我已经在使用 ApplyDispatchBehavior() 添加我的 IParameterInspector,因此添加消息检查器也很快。从那里我可以从 instanceContext.GetServiceInstance() 获取服务实例......但是......消息检查器在参数检查器之前触发,所以当我需要它时,用户配置文件还没有被填充。
    【解决方案2】:

    我从这里得到了我需要的建议:How do I get access to the WCF service instance in the current context?

    从参数检查器中,我可以访问操作上下文,从中可以获取我的服务实例。因此,我可以简单地将其推送到 Parameter Inspector 中的服务,而不是通过订阅事件来拉取服务中的信息:

      var service = OperationContext.Current.InstanceContext.GetServiceInstance() as IRemoteServiceBase;
      if (service != null)
            service.UserProfile = userFromToken;
    

    【讨论】:

      猜你喜欢
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2011-12-01
      相关资源
      最近更新 更多