【问题标题】:How do I support ETags in ASP.NET MVC?如何在 ASP.NET MVC 中支持 ETag?
【发布时间】:2019-05-15 21:08:21
【问题描述】:

如何在 ASP.NET MVC 中支持 ETag?

【问题讨论】:

    标签: asp.net-mvc etag


    【解决方案1】:

    @Elijah Glover's answer 是答案的一部分,但并不完整。这将设置 ETag,但如果不在服务器端检查它,您将无法获得 ETag 的好处。你这样做:

    var requestedETag = Request.Headers["If-None-Match"];
    if (requestedETag == eTagOfContentToBeReturned)
            return new HttpStatusCodeResult(HttpStatusCode.NotModified);
    

    另外,另一个提示是您需要设置响应的可缓存性,否则默认情况下它是“私有的”并且不会在响应中设置 ETag:

    Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);
    

    一个完整的例子:

    public ActionResult Test304(string input)
    {
        var requestedETag = Request.Headers["If-None-Match"];
        var responseETag = LookupEtagFromInput(input); // lookup or generate etag however you want
        if (requestedETag == responseETag)
            return new HttpStatusCodeResult(HttpStatusCode.NotModified);
    
        Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);
        Response.Cache.SetETag(responseETag);
        return GetResponse(input); // do whatever work you need to obtain the result
    }
    

    【讨论】:

    • 这是一个很好的答案,对于那些希望实现它的人,我建议实现一个抽象的 ActionFilter 来实现这个测试逻辑,以及一个名为“abstract string CalculateEtag(HttpRequest)”的抽象方法,子类化它对于您需要 Etag 支持的每种情况。这将使您的 Actions 方法保持“精简”,并使测试 etag 生成更容易。
    • eTagOfContentToBeReturned 中存储了什么?如何为每个动作生成 etag ?
    【解决方案2】:

    MVC 中的 ETAG 与 WebForms 或 HttpHandlers 相同。

    您需要一种创建 ETAG 值的方法,我发现最好的方法是使用文件 MD5 或 ShortGuid

    由于 .net 接受字符串作为 ETAG,因此您可以使用轻松设置它

    String etag = GetETagValue(); //e.g. "00amyWGct0y_ze4lIsj2Mw"
    Response.Cache.SetETag(etag);
    

    来自MIX 的视频,最后他们将 ETAG 与 REST 结合使用

    【讨论】:

    • 我认为这是错误的!因为添加静态 ETag 就像说您的内容永远不会改变。 ETags 的想法是让浏览器知道内容发生了变化,类似于过期标头..
    • 我认为硬编码值仅用于说明目的......您可以即时创建并更改它。
    • 确实如此。使用 MD5 的提及表明它是经过计算的(可能仅在每次更改或运行时)并返回。显然不建议使用静态值。
    • 视频链接失效了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    • 2012-03-05
    • 1970-01-01
    相关资源
    最近更新 更多