Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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# ASP.NETWebAPI-缓存_C#_Asp.net_Caching_Asp.net Web Api - Fatal编程技术网

C# ASP.NETWebAPI-缓存

C# ASP.NETWebAPI-缓存,c#,asp.net,caching,asp.net-web-api,C#,Asp.net,Caching,Asp.net Web Api,我想在我的ASP.NETWebAPI 2中实现缓存。我的意思是,我有一个名为Profile的对象,它具有UserId、SiteId、ColorTheme等属性 每个请求都需要该对象,我不想保存在数据库中 我的问题是,ASP.Net WebApi在WebForm(例如redis)中是否有类似会话对象的缓存?ASP.Net WebApi 2遵循REST模式,并且按照该模式,它应该是无状态的,但您可以使用任何缓存机制来存储对象。出于同样的目的,我将Redis与Web API结合使用会话,因为它破坏了模

我想在我的ASP.NETWebAPI 2中实现缓存。我的意思是,我有一个名为Profile的对象,它具有UserId、SiteId、ColorTheme等属性

每个请求都需要该对象,我不想保存在数据库中


我的问题是,ASP.Net WebApi在WebForm(例如redis)中是否有类似会话对象的缓存?

ASP.Net WebApi 2遵循REST模式,并且按照该模式,它应该是无状态的,但您可以使用任何缓存机制来存储对象。出于同样的目的,我将Redis与Web API结合使用<应使用代码>会话,因为它破坏了模式
Httpcontext.Cache
是否受支持不确定。见以下帖子


如果您真的需要一个看起来像固溶体的缓存,您还可以通过添加

protected void Application_PostAuthorizeRequest()
{
    System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}
虽然这会严重损害您的web应用程序的性能。

Web API是为REST实现而设计的,REST体系结构的一个关键点是无状态性——您不应该有会话,您应该发送一个安全令牌,其中包含每个请求所需的所有用户信息。如果您以这种方式工作,您会发现框架更容易掌握,因为它就是这样设计的。

使用会话将您的实现与一个完全不是无状态(因此不是restful)的细节紧密耦合

我要做的是使用一个为这个特定目的而创建的库,比如

如果您计划在单个实例中执行应用程序,并在需要时随时切换到分布式方法(如Redis),它将帮助您实现一个抽象缓存,该缓存可能由
RuntimeCaching
支持

在依赖项注入框架内注册(伪代码):

container.RegisterSingleton(()=>
CacheFactory.Build(settings=>settings.WithSystemRuntimeCacheHandle());
然后将其注入控制器中:

public class MyController : ApiController
{
    private readonly ICache<MyObject> _cache;

    public MyController(ICache<MyObject> cache)
    {
        _cache = cache;
    }

    public IHttpActionResult GetCached()
    {
         var myObj = _cache.Get("myKey");
         if(myObj == null)
         {
             myObj = GetObjectFromWhereverYouWant();
             _cache.Put(myObj, "myKey");
         }

         return Ok(myObj);
    }
公共类MyController:ApiController
{
专用只读ICache\u缓存;
公共MyController(ICache缓存)
{
_缓存=缓存;
}
公共IHttpActionResult GetCached()
{
var myObj=_cache.Get(“myKey”);
if(myObj==null)
{
myObj=getobjectfromwhereyouwant();
_cache.Put(myObj,myKey);
}
返回Ok(myObj);
}

在中可以找到更多的示例。

您确定不想使用现有数据库吗?您是否有峰值流量或规模,这意味着在每次请求时从记录系统生成配置文件实际上是有问题的?如果没有更多信息,很难知道,但如果是我,我会犹豫直接跳到会话统计或内存中缓存作为两者

您可以考虑在没有缓存或会话状态的情况下,将简单的解决方案放入生产中,使用现有的DB,并测量是否需要改进?

假设您确实需要比数据库更快的东西,我会使用一个名为的开源库将用户配置文件缓存在内存中,该库将用两行代码为您进行缓存。它也可以在
[nuget][1]
上找到

// get the cache (or use dependency injection?)
IAppCache cache = new CachingService(); 
// get the user from cache or create their profile
var cachedResults = cache.GetOrAdd("CacheKey", () => GetUser(userId));
默认情况下,它内置了锁定功能,因此每次缓存未命中时,可缓存方法只执行一次,并且它使用lambda,因此您可以一次性执行“获取或添加”


(免责声明:我是LazyCache的作者)

您可以使用WebApi中的会话,但不推荐使用,因为WebApi在理想情况下应该是无状态的,添加会话会中断会话。
// get the cache (or use dependency injection?)
IAppCache cache = new CachingService(); 
// get the user from cache or create their profile
var cachedResults = cache.GetOrAdd("CacheKey", () => GetUser(userId));