用于HTTP 503状态代码的ASP.NET MVC OutputCache

时间:2013-11-21 15:22:25

标签: asp.net asp.net-mvc asp.net-mvc-4

我想使用ASP.NET MVC 5.0创建服务器监控应用程序。 如果服务器不可用,我想返回HTTP 503状态代码以及带有服务器状态详细信息的Json内容。此外,我想使用ASP.NET输出缓存将此响应缓存特定的持续时间(例如10秒)。

我面临的问题是ASP.NET MVC 5.0中的OutputCache过滤器在状态代码为HTTP 200时有效,但在HTTP 503时无效。以下是我在我的应用程序中使用的MVC操作的示例代码。

HTTP 200以外的HTTP状态代码是否不可缓存?是否有任何替代机制通过输出缓存或任何IIS设置缓存HTTP 503响应?

[OutputCache(Duration = 10, VaryByParam = "*")]
public ActionResult GetServerStatus(string serverId)
{
    var serverStatus = .... //JSON object
    if(serverStatus.IsAvailable)
    {
        this.Response.StatusCode = (int)HttpStatusCode.OK;
    }
    else
    {
        this.Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
    }
    return Json(serverStatus);
}

1 个答案:

答案 0 :(得分:1)

据我所知,OutputCache只缓存有效的响应。我快速挖掘了源代码,我看不出任何明显的方法来覆盖这种行为。

我想最简单的答案就是自己缓存服务器状态。

类似的东西:

public ActionResult GetServerStatus(string serverId)
{
    string serverStatus = Cache["someKey"];
    if(serverStatus == null)
    {
         serverStatus = ...;
         // Use Cache.Insert for setting duration etc
         Cache["someKey"] = serverStatus;
    }

    if(serverStatus.IsAvailable)
    {
        this.Response.StatusCode = (int)HttpStatusCode.OK;
    }
    else
    {
        this.Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
    }

    return Json(serverStatus);
}

应该做的伎俩。如果你在搜索SO周围,你会发现一些有用的缓存包装器,这使得插入和检索有点“更好”。