我必须在asp.net web api方法中实现缓存,因为我从第三方数据源访问数据并且调用第三方数据源成本高昂且数据每24小时更新一次。所以在{{3}的帮助下我实现了像这样的缓存
/// <summary>
/// Returns the sorted list of movies
/// </summary>
/// <returns>Collection of Movies</returns>
[CacheOutput(ClientTimeSpan = 86400, ServerTimeSpan =86400)]
public IEnumerable<Movie> Get()
{
return repository.GetMovies().OrderBy(c => c.MovieId);
}
/// <summary>
/// Returns a movie
/// </summary>
/// <param name="movie">movieId</param>
/// <returns>Movie</returns>
[CacheOutput(ClientTimeSpan = 86400, ServerTimeSpan = 86400)]
public Movie Get(int movieId)
{
var movie = repository.GetMovieById(movieId);
if (movie == null)
{
var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.NotFound)
{
Content = new StringContent(string.Format("No movie with ID = {0}", movieId)),
ReasonPhrase = "Movie ID Not Found"
};
throw new HttpResponseException(httpResponseMessage);
}
return movie;
}
但在Strathweb中,我看到两个属性,一个是ClientTimeSpan,另一个是ServerTimeSpan。我不知道何时使用ClientTimeSpan以及何时使用ServerTimeSpan。在最简单的术语中,我想了解何时使用服务器端缓存以及何时使用使用客户端缓存以及两者之间的差异。
答案 0 :(得分:2)
正如定义所说
ClientTimeSpan
(对应于CacheControl MaxAge HTTP标头)
ServerTimeSpan
(应在服务器端缓存响应的时间)
代码示例,附有说明。
//Cache for 100s on the server, inform the client that response is valid for 100s
[CacheOutput(ClientTimeSpan = 100, ServerTimeSpan = 100)]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
//Inform the client that response is valid for 50s. Force client to revalidate.
[CacheOutput(ClientTimeSpan = 50, MustRevalidate = true)]
public string Get(int id)
{
return "value";
}
答案 1 :(得分:2)
ClientTimeSpan
如果要允许客户端(通常是浏览器)在本地缓存用户计算机上的数据,请使用客户端缓存。好处是客户端可能不会在缓存过期之前请求您的API。另一方面,您无法使此缓存无效,因为它存储在客户端。将此缓存用于非动态/不频繁更改的数据。
ServerTimeSpan
在您的服务器上存储数据。您可以轻松地使此缓存无效,但它需要一些资源(内存)