首页 > 解决方案 > 跟踪同一用户的 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:添加了为什么我计入代码以更清晰的原因。

标签: c#

解决方案


假设“外部库”不包括标准 .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;
    }
}

推荐阅读