Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#web api条件检查是否使用相同的参数调用相同的函数_C#_Asp.net Web Api - Fatal编程技术网

C#web api条件检查是否使用相同的参数调用相同的函数

C#web api条件检查是否使用相同的参数调用相同的函数,c#,asp.net-web-api,C#,Asp.net Web Api,我有一个C语言的web api 有一个函数可以使用相同的参数从客户端调用几次(当然是异步的) 我需要的是一种检查函数是否只是用相同的参数调用的方法,如果是,跳过一些代码。(不需要做两次的重大动作) 我试图向HttpContext.Current.Appliction添加一个列表,并在函数开始时检查列表是否包含以下参数: 如果包含-跳过它 如果没有-将参数添加到列表中并执行操作 在函数结束时,从列表中删除参数 但是,这不起作用,因为代码是从客户端的几个不同位置调用的(异步化) So-有时它出现在“

我有一个C语言的web api

有一个函数可以使用相同的参数从客户端调用几次(当然是异步的)

我需要的是一种检查函数是否只是用相同的参数调用的方法,如果是,跳过一些代码。(不需要做两次的重大动作)

我试图向HttpContext.Current.Appliction添加一个列表,并在函数开始时检查列表是否包含以下参数:

  • 如果包含-跳过它

  • 如果没有-将参数添加到列表中并执行操作

  • 在函数结束时,从列表中删除参数

    但是,这不起作用,因为代码是从客户端的几个不同位置调用的(异步化)

    So-有时它出现在“if”行,而参数还不在列表中,但在之前它将参数添加到列表中,它从第二次调用再次到达“if”行,因此参数还不在列表中,因此两者都是“true”,并且都进入if

        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调用端处理重复条件。