C# ASP.NETWebAPI-缓存
我想在我的ASP.NETWebAPI 2中实现缓存。我的意思是,我有一个名为Profile的对象,它具有UserId、SiteId、ColorTheme等属性 每个请求都需要该对象,我不想保存在数据库中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.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));