将缓存的 MVC 操作限制为 Request.IsLocal?
Restricting a cached MVC action to Request.IsLocal?
我有一个带 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 那么它将 return 为 null,并且 null 将被缓存一天...使特定的 GetStuffData(myVariable) 一天无用。
同理,如果先在本地调用,则外部请求会收到缓存的本地数据。
有没有办法将整个函数限制为 Request.IsLocal 而不仅仅是 return 值?
因此,例如,如果它是从外部访问的,您只会得到 404 或找不到方法等。但如果是 Request.Local,您将得到缓存的结果。
如果没有缓存,这 运行 完全没问题,但我正在努力寻找一种方法来结合 Request.IsLocal 和缓存。
可能相关的额外信息:
我通过 C# 调用 GetStuffData 来获取缓存的 StuffData,方法是像这样获取 json 对象...(直接调用操作不会导致它被缓存,所以我切换到模拟网络请求)
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();
}
您可以使用自定义授权过滤器属性,例如
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)
{}
我有一个带 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 那么它将 return 为 null,并且 null 将被缓存一天...使特定的 GetStuffData(myVariable) 一天无用。
同理,如果先在本地调用,则外部请求会收到缓存的本地数据。
有没有办法将整个函数限制为 Request.IsLocal 而不仅仅是 return 值?
因此,例如,如果它是从外部访问的,您只会得到 404 或找不到方法等。但如果是 Request.Local,您将得到缓存的结果。
如果没有缓存,这 运行 完全没问题,但我正在努力寻找一种方法来结合 Request.IsLocal 和缓存。
可能相关的额外信息:
我通过 C# 调用 GetStuffData 来获取缓存的 StuffData,方法是像这样获取 json 对象...(直接调用操作不会导致它被缓存,所以我切换到模拟网络请求)
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();
}
您可以使用自定义授权过滤器属性,例如
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)
{}