我正在尝试在我的ASP.NET MVC网站中使用OutputCaching。问题是,当我尝试更改其中一个查询字符串参数的值时,它返回了请求的第一个项目的数据!
以下是我的代码(已更改参数名称)...
[ApiAuthorize]
[HandleErrorAsJson]
public class SearchController : Controller
{
[AcceptVerbs(HttpVerbs.Get)]
[OutputCache(Duration = 60, VaryByParam = "*")]
public ActionResult ScoreCard(string foo, byte? bar, byte? pewpew)
{
..
}
}
- 注意1:ApiAuthorize --自定义属性,检查查询字符串参数是否为“Key”,并检查内存字典是否存在。
- 注意2:HandleErrorAsJson --自定义属性,如果抛出异常,则将错误消息返回为json格式。
以下是我对此操作进行的两个示例调用:
- /GET http://api.MySite.com/search/scorecard?foo=hello+world,+PewPew&key=abcd1234&bar=2
- /GET http://api.MySite.com/search/scorecard?foo=invalid+search+stuff&key=abcd1234&bar=2
因此,第一个调用(foo = hello world, Pew Pew)的数据将作为200 OK返回。 然后第二个api调用返回一个200 OK,但其中包含了先前调用的数据。
另外,我没有使用任何代理服务器。 如果我注释掉OutputCache属性,一切都很好。
我还尝试了手动列出每次需要缓存的列表...
[OutputCache(Duration = 60, VaryByParam = "foo,key,bar,pewpew")]
没那么幸运 :(
请注意,我需要确保将API“Key”参数作为缓存唯一键的一部分包括在内。我不希望别人搜索同样的内容,但如果第二个人没有正确的密钥,则不应该得到缓存结果,而是一个错误消息(技术上来说,它是401未经授权,但无论如何)...
您有什么想法?