C#web api条件检查是否使用相同的参数调用相同的函数
我有一个C语言的web api 有一个函数可以使用相同的参数从客户端调用几次(当然是异步的) 我需要的是一种检查函数是否只是用相同的参数调用的方法,如果是,跳过一些代码。(不需要做两次的重大动作) 我试图向HttpContext.Current.Appliction添加一个列表,并在函数开始时检查列表是否包含以下参数:C#web api条件检查是否使用相同的参数调用相同的函数,c#,asp.net-web-api,C#,Asp.net Web Api,我有一个C语言的web api 有一个函数可以使用相同的参数从客户端调用几次(当然是异步的) 我需要的是一种检查函数是否只是用相同的参数调用的方法,如果是,跳过一些代码。(不需要做两次的重大动作) 我试图向HttpContext.Current.Appliction添加一个列表,并在函数开始时检查列表是否包含以下参数: 如果包含-跳过它 如果没有-将参数添加到列表中并执行操作 在函数结束时,从列表中删除参数 但是,这不起作用,因为代码是从客户端的几个不同位置调用的(异步化) So-有时它出现在“
public void DoAction(string param)
{
try
{
if (HttpContext.Current.Application["CurrentDoActionParams"] == null)
{
HttpContext.Current.Application.Add("CurrentDoActionParams", new List<string>());
}
if (!((List<string>)HttpContext.Current.Application["CurrentDoActionParams"]).Contains(param))
{
((List<string>)HttpContext.Current.Application["CurrentDoActionParams"]).Add(param);
//.....
//do heavy action here
//.....
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (HttpContext.Current.Application["CurrentDoActionParams"] != null)
{
if (((List<string>)HttpContext.Current.Application["CurrentDoActionParams"]).Contains(param))
{
((List<string>)HttpContext.Current.Application["CurrentDoActionParams"]).Remove(param);
}
}
}
}
public void DoAction(字符串参数)
{
尝试
{
if(HttpContext.Current.Application[“CurrentDoActionParams”]==null)
{
HttpContext.Current.Application.Add(“CurrentDoActionParams”,new List());
}
如果(!((列表)HttpContext.Current.Application[“CurrentDoActionParams”]).Contains(param))
{
((列表)HttpContext.Current.Application[“CurrentDoActionParams”).Add(param);
//.....
//你在这里干什么
//.....
}
}
捕获(例外情况除外)
{
掷骰子;
}
最后
{
if(HttpContext.Current.Application[“CurrentDoActionParams”]!=null)
{
if(((列表)HttpContext.Current.Application[“CurrentDoActionParams”])包含(param))
{
((列表)HttpContext.Current.Application[“CurrentDoActionParams”]).Remove(param);
}
}
}
}
有没有办法做到这一点?正确的方法是什么?能否实现缓存并设置合适的过期选项
然后,您的操作可以检查缓存,查看该项是否已经存在并返回它;如果不存在,它可以执行必要的操作,为用户生成一个新项目,然后将其添加到缓存中。首先,如果您这样做,我建议使用
哈希集,因为查找速度会更快,而且专为这类事情而设计。确保对检查和向哈希集中添加内容设置了锁定
@marhls建议使用缓存,这很容易做到。只需确保,如果缓存中没有某个内容,则在添加它时使用锁
,这样您就不会得到当前所经历的明显竞争条件。应用程序级缓存是确保这一点的一个好方法
例如:
键可以是具有特定参数值的方法的名称。
例如,如果您的方法如下所示:
public int MyMethod(int firstParam, int secondParam)
然后,当调用值为3,4的方法时,缓存键可以是:
MyMethod_3_4
数据就是这个方法的结果。这样,当调用该方法时,您将获得密钥,然后检查缓存
- 它在那里吗?使用唯一密钥从缓存中获取数据
- 它不在那里,所以运行该方法,获取数据并缓存它
使缓存在任何对您有意义的值之后过期
现在,只有在没有很多方法和大量数据的情况下才能这样做
如果您想存储更多的数据,请使用专用的缓存系统,如Redis、NCache或其他您认为合适的系统。您必须在api调用端处理重复条件。