将缓存的MVC操作限制为Request.IsLocal?

时间:2015-10-20 20:18:30

标签: c# asp.net-mvc outputcache

我有一个带有OutputCache的MVC操作,因为我需要缓存数据以最小化对myService的调用。

[HttpGet]
[OutputCache(Duration = 86400, Location = OutputCacheLocation.ServerAndClient, VaryByParam = "myVariable")]
public JsonResult GetStuffData(string myVariable)
{
    if (Request.IsLocal)
    {
        return myService.CalculateStuff(myVariable)
    }
    else
    {
        return null;
    }
}

我希望这只能从它运行的服务器上访问,因此可以访问Request.IsLocal。

这样可以正常工作,但是如果有人远程访问GetStuffData,那么它将返回null,并且null将被缓存一天......使得特定的GetStuffData(myVariable)在一天内无效。

同样,如果它首先在本地调用,那么外部请求将接收缓存的本地数据。

有没有办法将整个函数限制为Request.IsLocal而不仅仅是返回值?

例如,如果它是从外部访问的,那么您只需获得404,或者找不到方法等。但如果是Request.Local,您将获得缓存结果。

如果没有缓存,这将完全正常,但我很难找到一种方法来组合Request.IsLocal和缓存。

可能相关的额外信息:

我通过C#调用GetStuffData来获取StuffData,通过获取这样的json对象...(直接调用该动作从未导致它被缓存,所以我转而模拟webrequest)

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlToGetStuffData);
WebResponse response = request.GetResponse();
using (Stream responseStream = response.GetResponseStream()) {
    StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
    return reader.ReadToEnd();
}

1 个答案:

答案 0 :(得分:2)

您可以使用自定义授权过滤器属性,例如

public class OnlyLocalRequests : AuthorizeAttribute
{
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (!httpContext.Request.IsLocal)
            {
                httpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
                return false;
            }
            return true;
        }
}

并将您的操作装饰为

[HttpGet]
[OnlyLocalRequests]
[OutputCache(Duration = 86400, Location = OutputCacheLocation.ServerAndClient, VaryByParam = "myVariable")]
public JsonResult GetStuffData(string myVariable)
{}