問題タブ [if-none-match]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
etag - etags とチャンクエンコーディングを同時に活用していますか?
更新された質問
アプリケーションでどのように etag を活用できますか? また、ストリーミング/チャンク エンコーディングを導入すると複雑になりますか?
元の質問
で HTTP ストリーミングを行う場合Transfer-Encoding: chunked
、Content-Length
は不明な場合が多いため送信できません。
私の理解では、ブラウザーが etags を利用する場合、知っておく必要がありますContent-Length
。etag が提供されていても提供されていない場合Content-Length
、ブラウザは決して送信しませんIf-None-Match
。
これを回避する方法はありますか?
nsurlconnection - NSUrlConnection での Etag の処理はランダムのようです
設定
現在のプロジェクトでは、AFNetworking (Foundation URL Loading System に基づく) を使用しています。これまでのところ、すべて正常に動作しています。
仮説
最近、応答ヘッダーに ETag を導入しました。これは、デフォルトで NSURLConnection (Foundation URL Loading System を意味します) で処理する必要があります。受信した ETag 値 (応答から) は、次の要求ヘッダーに「If-None-Match」として含める必要があります。それが理論です。
実際には、ETag は整数であり、バックエンドは有効なリクエストごとにこの整数を増加させ、この増加した値を応答ヘッダーで送信します。
クライアントでは何も変更せず、charles でリクエストとレスポンスのヘッダーをチェックしました。キャッシングを統合する予定はありません。ETag 値の処理にのみ関心があります。
結果
結果は本当に奇妙です。最初のリクエスト (約 10 件のリクエスト) では、「If-None-Match」ヘッダー フィールドは設定されませんでした。この期間の後、一部のリクエストについてはすべて問題ありません。最後に受信した ETag 値は、次のリクエストの「If-None-Match」ヘッダー フィールドで送信されます。その後、約 30 回のリクエストの後、「If-None-Match」ヘッダー フィールドの値は想定された値ではありません。たとえば、最後に受信した ETag 値は 38 で、リクエストの「If-None-Match」値は 8 です。
p>質問
NSURLConnection (Foundation URL Loading System を意味します) で ETag がどのように処理されるか、およびこれらの奇妙な結果が表示される理由について、経験または知識がある人はいますか?
またはさらに直接的に、問題を解決するためのヒントや練習方法はありますか? NSURLCache などに特定の値を設定する必要がありますか?
facebook - Facebook で ETag を使用していますが、ステータス コードは常に 200 であり、304 ではありません。
ETag を使用してhttps://graph.facebook.com/me/friends?fields=id,name,first_name,last_name,link,picture&access_token=MyAccessTokenのリクエストを呼び出そうとすると、常にリクエスト コードが 200 になります。毎回。2回連続で返信して確認しました。変更は最後にページネーションのセクションがあり、アクセス トークンが添付されていました。これは常に異なるため、ETag 値も変更されます。FirefoxでREStClientアドオンを使用しようとしましたが、同じ動作です。Facebook Docs でここに記載されているように、Firebug および Modify Headers Add-ons も試しましたが、変更はありませんでした。別のリクエストを呼び出してみました /me? 期待どおりに動作しますが、/me/friends と /me/events の場合、常に 200 応答が返されます。どんな助けでも大歓迎です。
この質問はこの質問に似ていますが、答えがうまくいきません。ありがとうございました。
playframework - If-None-Match ヘッダーは Cache-Control: max-age を無効にしますか?
画像を提供する webapp があります。
私は明らかにCache-Control
ヘッダーを適切に設定しており、Web サーバーはEtag
.
問題は、ヘッダーを効果的に無視して、リソースがIf-None-Match
毎回編集されていることです。Cache-Control
(フレームワークはそれに応じて 304 を返しますが、ラウンドトリップが存在します)。
リソースがローカルで有効な場合でも、Etag
ヘッダーが無効になり、一致を確認する可能性があることを読みました。Cache-Control
これは私には意味がありません。
誰が何が起こっているのか知っていますか?ここで何が欠けていますか?
PD: Web サーバーは Play です。応用
django - Django で応答に ETAG を設定したときに、request.META に「HTTP-IF-NONE-MATCH」が含まれないのはなぜですか?
応答のコードは次のとおりです。
IF-NONE-MATCH
次の情報はありませんrequest.META
。
誰かが理由と方法を教えてもらえますか?
client - クライアント プロキシの Odata v4 サービス T4 テンプレートから生成されたコードは、クエリ要求に If-None-Match ヘッダーを追加しません。
ODataController クラスを使用し、Entity Framework で同時実行チェックをサポートすることで、OData v4 プロトコルで WebAPI 2 サービスを作成しました。クライアント側のコードは、Odata クライアント T4 テンプレートを使用して生成されます。このコードは、エンティティの追跡を処理し、Odata URL の LINQ クエリを解析する DataServiceContext から派生したプロキシ クラスとコンテナー クラスを生成します。追跡対象のエンティティ (同時実行性がチェックされるプロパティを含む) が更新されると、SaveChangesAsync メソッドを呼び出すコンテナー クラスが HTTP PATCH を生成します。そのエンティティの最後のクエリから受け取った値を持つ If-Match ヘッダーを含むリクエストで、正常に動作します。
Fiddler によってキャッチされるリクエストの例:
パッチ /Users(2) HTTP/1.1
キャッシュ
If-Match: W/"J1Z1a2FzaWU3Bhc2IjJw=="
ただし、コンテナがエンティティのクエリを作成する場合、正しい HTTP GET リクエストを生成します
(リクエストの例:
GET /Animals(8) HTTP/1.1)
ただし、If-None-Match ヘッダーがない場合、最後のクエリであっても、サービスは応答で etag 値を送信します
(応答の例:
@odata.etag=W/"J0MxRjIn")
コンテナー コンテキスト構成の requestpipeline プロパティを設定するか、他の方法で If-None-Match ヘッダーを追加することは可能ですか? 備考を追加する - サービスが GET 要求の If-None-Match ヘッダーで etag 値を取得する場合、etag 値が一致する場合 (エンティティが変更されないことを意味する)、ステータス コード 304 NotModified を返す必要があります。それ以外の場合、サービスは応答本文でエンティティ プロパティを送信します。 .
アップデート:
SendingRequest2 を処理して If-None-Match を追加しようとしたところ、If-None-Match ヘッダーを手動で追加できるようになりましたが、その場合、サービスがリクエストを受信してそこから etag を読み取るときに、エンティティが変更されていない場合 (etag が一致する場合) 、答えは statuscode 304 - NotModified であり、コンテナー (派生 DataServiceContext クラスのインスタンス) はその応答を処理できません。これは、本文メッセージにエンティティーが含まれていると予想されるため、例外が生成されるためです。例外を処理し、それを使用してエンティティが変更されていないことを確認できますが、これはプログラミングを行うための最適化された方法ではありません。リクエストとレスポンスのパイプライン イベントに入る方法が必要です。リクエスト パイプラインでは、単一のクエリ リクエストに etag を追加し、応答パイプラインでは、受信したステータス コード 304 - NotModified を処理します。
context.Configuration.RequestPipeline のリストは次のとおりです。
OnEntityReferenceLink(アクション アクション);
OnEntryEnding(アクション アクション);
OnEntryStarting(アクション アクション);
OnMessageWriterSettingsCreated(アクション引数);
OnNavigationLinkEnding(アクション アクション);
OnNavigationLinkStarting(アクション アクション);
context.Configuration.ResponsePipeline のリストは次のとおりです。
OnEntityMaterialized(アクション アクション);
OnEntryEnded(アクション アクション);
OnEntryStarted(アクション アクション);
OnFeedEnded(アクション アクション);
OnFeedStarted(アクション アクション);
OnMessageReaderSettingsCreated(Action messageReaderSettingsAction);
OnNavigationLinkEnded(アクション アクション);
OnNavigationLinkStarted(アクション アクション);
caching - ETag は Cache-Control ヘッダーを無効にしますか?
RESTful Web サービスからリソースを取得しており、応答に次の 2 つのヘッダーを追加しています。
ブラウザーがこの応答を初めて取得したとき、2 分間正しくキャッシュされました。
ただし、次にリソースを要求したとき、ブラウザーはIfNoneMatch
ヘッダーを送信し、期待どおりに取得し、2 分間キャッシュ304 Not Modified
する別のヘッダーを取得しました。Cache-Control
しかし、ブラウザは応答をキャッシュしませんでした。私はページを更新し続け、リクエストを出し続けているため、取得し続けて304 Not Modified
います。
これは正常な動作ですか?
304 Not Modified
を取得した後、キャッシュされたリソースをさらに 2 分間再検証し、それ以上リクエストを行わないようにブラウザに指示するにはどうすればよいですか?