1

このスクリーンキャスト ¹で、Ruby in Rails で、eTag を埋めるための REST + モデルを考慮して、より優れたクライアント キャッシング ² を実行できることがわかりましたすべての http 本文をレンダリングしてから、通常どおり eTag を計算するよりもはるかにスマートです。

このプロパティは、GET を使用する場合にクライアント キャッシングをよりモデル指向にすることができるため、これはパフォーマンスに優れていると思います。

誰かがasp.net MVCでこれを作っているところを見たことがありません。この人が Rails でやっているのを見たのと同じくらい簡単でしょうか?

4

2 に答える 2

1

eTag は、1 つのサーバー側テクノロジーに関連するというよりも、HTTP の概念です。RoR は、IIS/MVC と比較して、eTag を使用して特定のファイルがキャッシュされていることを示すのが簡単になると思います。

IIS/MVC の場合、応答ヘッダーを設定するオプションが 2 つあります (eTag 設定を含めることができます)。

  1. IIS コンテンツの有効期限設定ダイアログで。
  2. HTTP ハンドラーまたは同様の手法をセットアップして、特定の要求に対して必要な応答ヘッダーを正確に指定します。これは、ステップ #1 のプログラムによるバリエーションです。ネットワーク経由でデータベース コンテンツをストリーミングする場合に必要です。この場合、実際のファイルはありません。

私がリストしていない他の方法でこれを実現する方法がある場合は、それらについて知りたいです。

于 2009-09-19T19:54:07.757 に答える
0

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";
        }
    }
}

元の元: ASP.NET MVC で ETag フィルターを作成する

于 2013-03-14T02:55:08.010 に答える