限制每分钟、每个方法、每个 IP 对 WCF 服务的调用

2024-01-10

我想限制任何不同 IP 对 WCF 服务上特定方法的调用次数x按时间范围调用y.

例如,如果 IP10.0.1.1调用方法register在某一分钟内超过 5 次(称之为分钟)x),当它尝试在那分钟内第六次调用该方法时,它会被阻塞,直到分钟(x + 1).

这是因为我的系统上唯一的非令牌授权调用是register称呼。我担心尝试用调用淹没此方法会使我的服务器在负载下挣扎。该方法背后有相当多的处理,并且它被设计为仅偶尔调用。

我已经考虑添加ServiceThrottlingBehavior到配置文件,但这对于服务是全局的,而不是服务方法的本地。

是否有一个好的/标准化的方法来做到这一点,无论是通过编程还是在配置文件中?


实现此目的的一种方法是使用 ServiceBehavior 添加一个实例来实现IInstanceContext初始化器 http://blogs.msdn.com/b/carlosfigueira/archive/2012/02/14/wcf-extensibility-initializers-instance-context-channel-call-context.aspx.

我的实现如下所示:

public class PerOperationThrottle: IInstanceContextInitializer
{
    static MemoryCache cache = new MemoryCache("foo", null);

    public void Initialize(InstanceContext instanceContext, Message message)
    {
        RemoteEndpointMessageProperty  ep = message.Properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
        // which action do we want to throttle
        if (message.Headers.Action.EndsWith("register") &&
            ep != null && 
            ep.Address != null)
        {
            // get the IP address 
            var item = cache[ep.Address];
            if (item == null)
            {
                // not found, so init
                cache.Add(
                    ep.Address,
                    new Counter { Count = 0 },
                    new CacheItemPolicy
                    {
                        SlidingExpiration = new TimeSpan(0, 1, 0) // 1 minute
                    });
            }
            else
            {
                // how many calls?
                var count = (Counter)item;
                if (count.Count > 5)
                {
                    instanceContext.Abort();
                    // not sure if this the best way to break
                    throw new Exception("throttle");
                }
                // add one call
                count.Count++;
            }
        }
    }
}

我用的是有点幼稚的内存缓存 https://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.110).aspx实现为我的自定义的每个 IP 地址保存一个实例Counter class:

public class Counter
{
    public int Count;
}

连接一个实例PerOperationThrottle对于该服务,我有一个帮助程序类,它结合了服务行为 http://blogs.msdn.com/b/carlosfigueira/archive/2011/03/22/wcf-extensibility-iservicebehavior.aspx and I端点行为 http://blogs.msdn.com/b/carlosfigueira/archive/2011/04/05/wcf-extensibility-iendpointbehavior.aspx:

public class PerOperationThrottleBehaviorAttribute : Attribute, IServiceBehavior,IEndpointBehavior
{
    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach(var ep in serviceDescription.Endpoints)
        {
            // add the EndpointBehavior
            ep.EndpointBehaviors.Add(this);
        }      
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
        // our PerOperationThrottle gets created and wired
        endpointDispatcher.
            DispatchRuntime.
            InstanceContextInitializers.
            Add(new PerOperationThrottle());
    }

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }
    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
    }
    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {   
    }
    public void Validate(ServiceEndpoint endpoint)
    {   
    }
    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    { 
    }
}

空方法属于接口,但不需要任何实现。确保删除throw new NotImplementedException(); though.

最后我们用我们的自定义属性注释Service实现类PerOperationThrottleBehavior

[PerOperationThrottleBehavior]
public class Service1 : IService1
{
    public string register(int value)
    {
        return string.Format("You entered: {0}", value);
    }
}

If the register一分钟内调用操作超过 5 次,服务抛出异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

限制每分钟、每个方法、每个 IP 对 WCF 服务的调用 的相关文章

  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • 我必须做什么才能使通过 HTTPS 提供的图像等内容缓存在客户端?

    我使用 Tomcat 作为服务器 使用 Internet Explorer 6 作为浏览器 我们应用程序中的网页大约有 75 张图像 我们正在使用 SSL 加载所有内容似乎非常慢 如何配置 Tomcat 以便 IE 缓存图像 如果您通过 h
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 为什么这个函数在额外读取内存时运行速度如此之快?

    我目前正在尝试了解 x86 64 上某些循环的性能属性 特别是我的 Intel R Core TM i3 8145U CPU 2 10GHz 处理器 具体来说 在循环体内添加一条额外的指令来读取内存几乎可以使性能提高一倍 而细节并不是特别重

随机推荐

  • Table2excel 插件不起作用

    我正在开发一个仪表板应用程序 我想实现 下载表为 xls 功能 在此链接上您可以看到表格的样子仪表板 http pasteboard co p82eqze png 我找到了一个library https github com rainabb
  • 按 lubridate 日期 %within% 间隔连接数据框

    我一直在练习和学习使用包含以下内容的列来处理 R 数据框lubridate数据类型 例如我的示例问题其他问题 https stackoverflow com questions 51407177 r lubridate split dura
  • Hadoop start-all.sh错误:没有这样的文件或目录

    成功创建名称节点后 我在尝试启动名称节点时遇到了这个问题 对我来说 它似乎试图记录到一个不存在的文件 如何更改设置以将脚本日志定向到正确的目录 bash 3 2 start all sh starting namenode logging
  • 如何在 Docker 第 3 部分教程中使用curl -4 http://localhost?

    使用 Docker 教程我被困在这部分 https docs docker com get started part3 run your new load balanced app https docs docker com get sta
  • 读取 Hadoop ArrayWritable 中包装的值

    我是 Hadoop 和 Java 的新手 我的映射器输出文本和 Arraywritable 我在读取 ArrayWritable 值时遇到问题 Unbale 将 get 值转换为整数 附上映射器和减速器代码 有人可以帮我纠正我的减速器代码以
  • 计算 PHP 数组中的日期

    我有这个数组 Array 0 gt Array x gt 2016 04 19 1 gt Array x gt 2016 05 25 2 gt Array x gt 2016 05 26 3 gt Array x gt 2016 05 27
  • std::tuple 用于不可复制和不可移动的对象

    我有一门删除了复制和移动向量的课程 struct A A int a data a A std cout lt lt A lt lt this lt lt lt lt data lt lt std endl A A const obj de
  • Maven SCR 插件 - 不生成 OSGI-INF 文件夹

    我的 SCR 插件无法正常工作 我已经尽可能多地进行了搜索 但只找到了与我需要使用的结构不相似的示例 下面是 POM 的片段 这些几乎是 CQ 项目原型生成的默认值 所有依赖项都在那里 所以可能不是这样 这是构建的输出 SLF4J Fail
  • CodeIgniter 2.x 会话和 Internet Explorer

    我在网上阅读了大量有关 CodeIgniter 及其会话和 Internet Explorer 问题的文章 其中很多内容似乎都以会话名称为中心 名称中没有下划线 这些文章似乎都是针对 CI 1 x 的 CI还存在这个问题吗 我尝试删除下划线
  • 英特尔伽利略裸机 UART

    我想编写一些 hello world 程序裸机申请于英特尔伽利略木板 当然 使用 UEFI 打印文本 到 UART 1 效果很好 但我想 手动 访问 UART 而不需要 UEFI 的任何帮助 在 QEMU 中我的代码运行良好 h file
  • 如何将 Spark 数据帧转换为 Polars 数据帧?

    我想知道如何将 Spark 数据帧转换为 Polars 数据帧 假设我在 PySpark 上有这段代码 df spark sql select from tmp 我可以使用以下命令轻松地将其转换为 pandas 数据框 toPandas 极
  • 使用ionic 4,尝试在应用程序使用硬件后退按钮按下事件关闭之前向用户发出退出警报消息

    在我的最初阶段 我试图给出 退出应用程序 是 否 当用户从登录页面或主页 登录后 按下硬件后退按钮时发出警报 我面临的问题是 当我按下后退按钮时 退出警报消息会出现在每个页面上 而不仅仅是在登录或主页上 此外 无论我是否按警报框中的 否 选
  • 如何删除除包含 TRUNCATE - INSERT 的行之外的所有行

    我创建了一个脚本 将所有 PL SQL 文件格式化为一个具有值对的简单文件 它很难解释 我认为如果您只查看该文件会更容易 PROCEDURE VALIDA CAMBIO GPR TRUNCATE TMP MOD PVA INSERT TMP
  • Cocos2d 2.0 - 左下角有 3 个数字

    我的 Cocos2D 2 0 项目屏幕左下角有 3 个数字 82 0 016 60 0 60 可能是 FPS 那么其他两个呢 我记得以前的 Cocos 版本只有 FPS 数字 有什么线索吗 谢谢 82 lt number of draw c
  • 将平面 Python 字典转换为字典列表

    我有一本以下格式的字典 我不知道我将收到的行数或项目数 line 0 item1 a line 0 item2 34 line 1 item1 sd line 1 item2 2 line 1 item3 fg line 2 item1 f
  • 带 twitter bootstrap 的全宽布局

    我正在尝试完成类似于此的布局 http dribbble com shots 829195 Slate attachments 86422 http dribbble com shots 829195 Slate attachments 8
  • BI 与 Django?

    有没有办法使用 Django 开发 Bi 商业智能 解决方案 因此 应该可以使用多个数据源来定义模型 有人用过 Django 体验过 BI 吗 怎么可能行得通呢 我不确定您对 BI 的定义是什么 也不知道为什么您认为 BI 解决方案需要多个
  • 来自具有可变帧速率的图像的视频

    我想从静止图像创建视频 但我没有使用静态 FPS 而是为每个图像都有一个特定的时间戳 图像在时间上的间隔并不完全均匀 我该怎么做呢 我当前的代码 具有静态 FPS 如下 import cv2 import os image folder U
  • 绘制超平面线性SVM python

    我正在尝试绘制使用 LinearSVC 和 sklearn 训练的模型的超平面 请注意 我正在使用自然语言 在拟合模型之前 我使用 CountVectorizer 和 TfidfTransformer 提取了特征 这里是分类器 from s
  • 限制每分钟、每个方法、每个 IP 对 WCF 服务的调用

    我想限制任何不同 IP 对 WCF 服务上特定方法的调用次数x按时间范围调用y 例如 如果 IP10 0 1 1调用方法register在某一分钟内超过 5 次 称之为分钟 x 当它尝试在那分钟内第六次调用该方法时 它会被阻塞 直到分钟 x