我可以让我的ASP.Net WebAPI控制器缓存其结果吗?

时间:2014-06-09 12:46:26

标签: asp.net asp.net-web-api azure-caching

我有像这样的标准WebAPI方法。这些方法使用Entity Framework 6.1从SQL Server 2012数据库中检索数据:

    [ResponseType(typeof(Content))]
    public async Task<IHttpActionResult> Get(int id)
    {
        Content content = await db.Contents.FindAsync(id);
        if (content == null)
        {
            return NotFound();
        }

        return Ok(content);
    }

是否有一种方法可以缓存响应,因此每次都不会访问数据库?

2 个答案:

答案 0 :(得分:1)

我认为你可能需要使用ETags(实体标签)。我自己没有尝试过,但thisthat博客文章可能对您有用。后者还包含许多关于缓存的博客文章的其他链接。

答案 1 :(得分:0)

你可以这样使用

     if(HttpContext.Current.Cache["myKey"] == null){
             //Get the data from the database;  
               HttpContext.Current.Cache["myKey"] = content;
     }else
        return ok((Content)HttpContext.Current.Cache["myKey"]);

由于您的内容可以为null,请再保留一个缓存项以跟踪内容是否存在但为空

        HttpContext.Current.Cache["IsData"] = content == null ? false : true;

现在就这样做

            if(HttpContext.Current.Cache["IsData"] == null){
             //Get the data from the database; 
              HttpContext.Current.Cache["IsData"] = content == null ? false : true; 
              if(content != null){
               HttpContext.Current.Cache["myKey"] = content;

            }
     }  else
        return HttpContext.Current.Cache["myKey"] != null ? ok((Content)HttpContext.Current.Cache["myKey"]) : NotFound();;

此逻辑适用于您将要使用的任何类型的缓存。