c# - 跟踪同一用户的 Web 服务调用量
问题描述
我目前正在开发一个基于 Web 服务的应用程序,该应用程序需要跟踪特定客户端在特定时间范围内调用它的频率。服务的设置方式是客户端调用一个特定的url,触发一个特定的功能;该服务会做它需要做的任何事情,并吐出一个响应,该响应会被客户端解释为类似网页的 UI。
在该页面上,有一个重试按钮,它再次调用相同的链接,从一开始就重新启动应用程序。这无法更改,我无法控制发布参数,并且每次都会重新启动整个应用程序。
它看起来像这样:
//user calls www.imawebservice.com/dosomething.svc/somemethod
public class dosomething
{
public Response somemethod()
{
//do things
int counter = GetCounterSomehow(); // help please
if(counter > someLimit) return Response("go away");
counter++;
Response response = new Response(
new Link("www.imawebservice.com/dosomething.svc/somemethod"))
return response;
}
}
除了数据库,如何在 Web 服务自调用之间保存简单的键值对,最好是在 C# 中保存?如果这是一个基于超时的过程,那就更好了。
编辑:这些数据不应该保存很长时间。这是一个简单的计数器,在特定时间段后或基于服务流中的特定条件被丢弃。所需要的只是一种 C# 机制,可以在服务调用之间实质上缓存一个简单的键值对。
编辑 2:添加了为什么我计入代码以更清晰的原因。
解决方案
假设“外部库”不包括标准 .Net 库,您可以引用 System.Runtime.Caching,并执行与此类似的操作。有一些重载允许您使用基于时间的过期。
public class dosomething
{
public Response somemethod()
ObjectCache cache = System.Runtime.Caching.MemoryCache.Default;
int counter = (int?)cache["userId"] ?? 0;
if (counter>=1000) return; //example max calls threshold
cache.Set("userId", counter +1, DateTimeOffset.Now.AddHours(1));
Response response = new Response(
new Link("www.imawebservice.com/dosomething.svc/somemethod"))
return response;
}
}
推荐阅读
- reference - IBM Integration Bus ESQL 对 OutputRoot 的引用不起作用
- c# - C# 和 WPF,当使用 mvvm 样式和按钮操作作为带有命令参数的命令时,如何始终在命令参数中创建新对象?
- angular - 在 angular6 中传递 JSON.stringfy 中的多个值
- c++ - 检查两个矩形是否重叠或边缘是否接触
- amazon-web-services - AWS 认知和组
- android - 根据 Android 中的焦点元素在 WebView 中显示或隐藏键盘
- javascript - 页面加载之间的 getBoundingClientRect 偏差,替代方案?
- node.js - Nodejs SyntaxError:意外的令牌{
- nginx - Nginx代理服务器到基于域名的S3静态网站
- java - 如何以西里尔文返回下载的文件名?