ruby-on-rails eTag是否可以像在Rails中那样在www.example.com MVC中用于智能客户端缓存asp.net?

vxqlmq5t  于 2023-02-26  发布在  Ruby
关注(0)|答案(2)|浏览(117)

我发现在this screencast ¹中,你可以在Ruby on Rails中做一个better client caching ²,考虑REST +模型来填充eTag。比渲染所有http主体更聪明,只有在这一切之后,才像往常一样计算eTag。
当使用GET时,这个属性可以使客户机缓存更加面向模型,所以我认为这对于性能来说是非常好的。
我没有看到有人用www.example.com MVC做这个asp.net,它会像我在Rails中看到的那样容易吗?

n53p2ov0

n53p2ov01#

eTag是一个HTTP概念,而不是与任何一种服务器端技术相关。我相信RoR与IIS/MVC相比,可以更容易地指示使用eTag缓存的特定文件。
对于IIS/MVC,您有两个设置响应标头的选项(可以包括eTag设置):
1.在IIS内容过期设置对话框中。
1.设置HTTP处理器或类似的技术,以便为特定的请求准确地指定所需的响应头。这是步骤1的编程变体。如果您正在通过网络传输数据库内容,则必须这样做,在这种情况下,没有真实的的文件可言。
如果还有其他我没有列出的方法,我很想知道它们。

rryofs0p

rryofs0p2#

使用ActionFilterAttribute通过筛选器更新响应

public class ETagAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Filter = new ETagFilter(filterContext.HttpContext.Response, filterContext.RequestContext.HttpContext.Request);
    }
}

public class ETagFilter : MemoryStream
{
    private HttpResponseBase _response = null;
    private HttpRequestBase _request;
    private Stream _filter = null;

    public ETagFilter(HttpResponseBase response, HttpRequestBase request)
    {
        _response = response;
        _request = request;
        _filter = response.Filter;
    }

    private string GetToken(Stream stream)
    {
        byte[] checksum = new byte[0];
        checksum = MD5.Create().ComputeHash(stream);
        return Convert.ToBase64String(checksum, 0, checksum.Length);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        byte[] data = new byte[count];
        Buffer.BlockCopy(buffer, offset, data, 0, count);
        var token = GetToken(new MemoryStream(data));

        string clientToken = _request.Headers["If-None-Match"];

        if (token != clientToken)
        {
            _response.Headers["ETag"] = token;
            _filter.Write(data, 0, count);
        }
        else
        {
            _response.SuppressContent = true;
            _response.StatusCode = 304;
            _response.StatusDescription = "Not Modified";
            _response.Headers["Content-Length"] = "0";
        }
    }
}

原产地:Create ETag filter in ASP.NET MVC

相关问题