最新のASP.NETMVC4ベータ版では、ETagを介した条件付きGETサポートをどのようにサポートしますか?ActionFilterは、リクエストのIf-None-Matchヘッダーと比較するために、返されたリソースのETagを生成するリクエストを完了できる必要があります。次に、If-None-Matchヘッダーの着信ETagが生成されたETagと同じであるかどうかに関係なく、生成されたETagをETag応答ヘッダーに追加します。しかし、ASP.NET MVC4では、どこから始めればよいのかわかりません。助言がありますか?
4 に答える
個人的には、私は「フレームワーク マジック」のファンではなく、Web メソッドの単純な古いコードを好みます。
したがって、Get Web メソッド内で、次のように手動で応答を作成します。
var response = this.Request.CreateResponse(HttpStatusCode.OK, obj);
string hash = obj.ModifiedDate.GetHashCode().ToString();
response.Headers.ETag =
new EntityTagHeaderValue(String.Concat("\"", hash, "\""), true);
return response;
タイムスタンプのハッシュ コードから生成された ETag は、エンティティのタグ付けシステムが弱いことを純粋に示していることに注意してください。また、必要な追加の見積もりも表示されます。
必要なことを行う WebApiContrib にETagMessageHandlerがあります。
アップデート
WebApiContrib に RFC 2616 のサーバー側キャッシュを実装しました。CachingHandler を探します。詳細はこちら。
もっとアップデート
これはCacheCowの下で積極的に開発および拡張されます。これには、クライアント コンポーネントとサーバー コンポーネントの両方が含まれます。近日公開予定のNuGet パッケージ は現在公開されています。
WebApiContrib の CachingHandler は引き続き維持されるため、バグや問題があればお知らせください。
これはあなたが探しているもののようです(セクション「ETagのサポート」を参照):
モデルがドメインのより深い場所に格納されていて、[ConcurrencyCheck] 属性を適用できない場合は、ODataModelBuilder を使用して適用できます。
ODataModelBuilder builder = new ODataConventionModelBuilder();
var myEntity = builder.EntitySet<MyEntity>("MyEntities");
myEntity.EntityType.Property(l => l.Version).ConcurrencyToken = true;
これにより、「@odata.etag」プロパティが応答本文に追加されます。