servicestack,C#,Caching,servicestack" /> servicestack,C#,Caching,servicestack" />

C# ServiceStack:如何判断是否缓存了来自请求的返回?

C# ServiceStack:如何判断是否缓存了来自请求的返回?,c#,caching,servicestack,C#,Caching,servicestack,我在请求中连接了缓存,但是我想知道我要返回的返回是否来自缓存。有没有办法看到这一点?我可以访问代码库进行修改 ServiceStack的标准缓存模式: public class OrdersService : Service { public object Get(CachedOrders request) { var cacheKey = "unique_key_for_this_request"; return base.RequestCont

我在请求中连接了缓存,但是我想知道我要返回的返回是否来自缓存。有没有办法看到这一点?我可以访问代码库进行修改

ServiceStack的标准缓存模式:

public class OrdersService : Service
{
    public object Get(CachedOrders request)
    {
        var cacheKey = "unique_key_for_this_request";
        return base.RequestContext.ToOptimizedResultUsingCache(base.Cache,cacheKey,()=> 
            {
                //Delegate is executed if item doesn't exist in cache 
                //Any response DTO returned here will be cached automatically
            });
    }
}

如您在注释中所述,只有在缓存中不存在项时,才会执行传递给
ToOptimizedResultUsingCache
方法的委托。我只想在响应DTO中添加一个“cached at”属性,并在该委托中设置它

public class OrdersService : Service
{
    public object Get(CachedOrders request)
    {
        var cacheKey = "unique_key_for_this_request";
        var returnDto = base.RequestContext.ToOptimizedResultUsingCache(base.Cache,cacheKey,() => {
            return new MyReturnDto {
                CachedAt = DateTime.Now
            };                
        });
    }
}
然后可以使用
CachedAt
属性查看项目何时被缓存

如果不想修改DTO,可以在缓存结果时使用委托范围之外的变量

public class OrdersService : Service
{
    public object Get(CachedOrders request)
    {
        var cacheKey = "unique_key_for_this_request";
        var isCached = false;
        var returnDto = base.RequestContext.ToOptimizedResultUsingCache(base.Cache,cacheKey,() => {
            isCached = true;             
        });
        // Do something if it was cached...
    }
}

你能展示一下缓存代码吗?我很肯定(从mythz)读到,向DTO添加非业务相关数据会破坏ServiceStack中服务的核心实践。我不想在我所有的业务对象中添加CachedAt属性。我更喜欢通过某种方式从我的AppHost或ServiceStack运行时中检测响应是否来自缓存。您最近的编辑是个好主意。缓存返回时,可以将密钥/值对添加到base.Request.Items集合。然后从我的AppHost中,我可以从Items集合中查找密钥,并在那里执行我的逻辑。