【问题标题】:How can I intercept all calls to methods in a WCF .svc service?如何拦截对 WCF .svc 服务中方法的所有调用?
【发布时间】:2017-10-14 02:57:43
【问题描述】:

我有一个 WCF 服务,其中包含多个 Web 方法。我希望能够拦截所有方法的请求并查看 IP 地址。我宁愿不把逻辑放到每个被调用的 web 方法顶部的方法调用中,有没有办法从一个地方拦截对这些方法的所有调用?

如果它是一个页面,我会编写一个基本页面对象,但我不确定 wcf 调用是否引发了事件?

【问题讨论】:

  • 您可以使用 WCF 中的检查器Inspectors
  • @dhinesh 上面的评论链接似乎加载了带有恶意软件的页面,并希望我安装 Chrome 扩展程序。我已经向版主报告了。
  • 我建议您删除 asp.net 标签,因为您的问题比 asp.net 更广泛,并且对于使用 .NET 的 C# 编码器和 VB 编码器也非常有用。跨度>

标签: asp.net wcf


【解决方案1】:

WCF 允许您实现添加到堆栈的拦截器。有关示例,请参阅此 link。我不确定这是否允许您提取发件人 IP,但我认为值得一试。

【讨论】:

    【解决方案2】:

    您可以实现 IDispatchMessageInspector 并执行类似的操作。

    public object AfterReceiveRequest(ref Message request, 
    IClientChannel channel, InstanceContext instanceContext)
        {
            RemoteEndpointMessageProperty remoteEndpoint = request.Properties
        [RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
    
            //remoteEndpoint.Address will give you the address.  
    
            return null;
        }
    

    【讨论】:

    • host.Open() 调用之前,有没有一种简单的方法可以将它附加到 WCF 服务?我唯一看到的是我必须创建一个特殊的行为、绑定,然后是消息检查器。我扯下头发试图弄清楚这一点,最终放弃了。然后我发现了ServiceAuthorizationManager
    【解决方案3】:

    您可以使用自定义行为,它们是 WCF 可扩展性功能的一部分。这里有更多信息:Extending WCF with Custom Behaviors

    【讨论】:

      【解决方案4】:

      ServiceAuthorizationManager 有一个聪明的方法可以做到这一点,而且比IDispatchMessageInspector 的所有认真努力要容易得多。

      在您的 WCF 服务项目中创建一个类,如下所示:

      public class MyServiceAuthorizationManager : ServiceAuthorizationManager
      {
        protected override bool CheckAccessCore(OperationContext operationContext)
        {
          string classMethod = operationContext.RequestContext.RequestMessage.Headers.Action;
          if (classMethod.Contains("/transfer/Get"))
          {
            return true; // because someone is simply updating a client service reference
          }
          Console.WriteLine("Class Method Call: {0}",classMethod);
          // do something with operationContext here as you need to inspect stuff
          // return true if you want this class method call to succeed and go through
          // return false if you want this class method to fail on the client
          return true;
        }
      }
      

      然后,在您的服务中,在您调用 host.Open() 之前,将链接添加到 MyServiceAuthorizationManager

      ServiceHost host = new ServiceHost(typeof(MyProject.Service1));
      host.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager();
      host.Open();
      

      现在,当您测试客户端连接时,您会注意到控制台会输出调用的类方法。您还可以处理 operationContext 对象中的所有内容。

      我使用它的一种方法是进行安全标头检查。在我的客户端中,我添加了一个标题。然后,在服务中,在此 CheckAccessCore() 调用中,我验证此自定义标头是否存在。如果不是,那么我返回false。这是将黑客拒之门外的另一层保护,对于命名管道配置中的有限安全性也非常有用。如果您也想这样做,请click here 了解有关如何添加自定义标头的更多信息,这些标头会在每个客户端对服务的方法调用时自动发送。

      请注意,在所有这些中,我不必搞乱行为、声明、侦听器或消息调度。我也不需要编辑我的 WCF 配置。

      注意上面对/transfer/Get 的字符串检查。如果您像我一样将标头检查作为安全机制进行,这一点很重要。如果您没有该条件并返回 true,那么您的 WCF 客户端 IDE 将无法更新其 ServiceReference,因为 IDE 不知道该额外的标头(如果您要添加自定义标头而不指定该标头在 WCF 客户端的 app.config 中)。否则,你会得到一个错误The URI prefix is not recognized

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-04
        • 2018-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多