4

I've got a WCF service (basicHttpBinding, basic authentication, IIS 6.0) on which I want to restrict the number of calls per hour - on user basis. For example, max 1000 calls per user, per hour (a la Google Maps, etc).

I also want to implement some sort of subscription mechanism, so that users can upgrade their call-limit across various 'price plans'.

I know that I could achieve this with a custom Inspector, backed by a DB containing some sort of 'subscription' table and a counter, but I'd like to avoid reinventing the wheel.

Does anyone have experience doing this? Are there 3rd party projects/libraries that support this out of the box?

Thanks. Eric

4

2 回答 2

2

我不知道是否有任何现成的软件包可以做到这一点(有人听吗?可能是一个机会!),但这是我对这个问题的快速想法:

  1. 您的要求是“在最后一小时内”——让我们说“时间段”而不是小时,因为这很容易改变。您必须跟踪该用户在该时间段内的所有呼叫,并具有某种机制来滚动或存档此数据。如果您要存储在数据库中,这可能是一个重大的性能问题,具体取决于您的数据库、用户数量、每个时间段的调用次数等。设计一个通用接口让您非常容易如果需要,可以在缓存中拼接——但您还需要跟踪检索 API/服务限制信息所花费的总时间。

  2. 如果可能,在服务级别对“有限功能”进行分区——而不是单个操作或方法。如果您可以将限制应用于整个服务的使用以及仅适用于特定或个别方法,那么一切都会变得更容易:代码、跟踪、用户的理解等。总的来说,就是......

  3. 拦截和检查的正确位置不在消息检查器恕我直言,而是在OperationInvoker中。通过服务范围的行为安装自定义操作调用程序,您将锁定整个服务。此外,您将可以访问消息处理后的信息,例如经过身份验证的用户名等。请参阅 Skonnard 在 MSDN 上的文章“通过行为扩展 WCF ”(http://msdn.microsoft.com/en-us/magazine/ cc163302.aspx#S6)。

希望这会有所帮助。如果您决定自己做,请确保处理并发(多个线程同时调用您的服务)!如果您有更多问题,了解您的情况的基本参数可能会有所帮助,例如用户量、调用、可扩展性问题(例如网络农场或单个服务器?)。——基思

于 2010-07-01T18:05:37.527 回答
0

最简单的方法是将代码添加到您的服务中,它所做的第一件事是检查它是否已达到限制,然后更新计数器。

如果从架构的角度来看,它是您的业务逻辑,通常应该在业务层中实现。

于 2010-06-25T13:43:04.087 回答