我可以在操作方法调用之前钩入任何WCF事件吗?

本文关键字:WCF 任何 事件 操作方法 调用 我可以 | 更新日期: 2023-09-27 18:17:47

我使用IPropertyInspector来验证提供的令牌并获取相应的用户配置文件(如果未找到令牌或无效,我会抛出故障异常)。然后,我按照建议的实现将此用户配置文件存储在OperationContext中:(在哪里存储当前WCF调用的数据?ThreadStatic安全吗?)

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

如果没有,我将使用RemoteRequestContext.Current。项目["User"]作为UserProfile每次我想要它,但一个字段会更干净,更方便。

我可以在操作方法调用之前钩入任何WCF事件吗?

你可以实现Attribute, IServiceBehavior和IDispatchMessageInspector接口,在ApplyDispatchBehavior()方法中你可以调用你的方法。它将在每次执行任何Operation方法之前执行。你只是在网上读到Attribute, IServiceBehavior和IDispatchMessageInspector。如果你没有得到任何注释,我会给你一些源代码。

我从这里得到了我需要的建议:我如何在当前上下文中访问WCF服务实例?

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

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