2

System.Net.Http.HttpClientCouchDb と組み合わせて .Net 4.5 で見つかったものを使用しています。

私はrevisionある文書を持っています: 3-789d4d2b33bf4505f8f23fd4a1025a4e.

If-Match問題は、リクエストのヘッダーフラグでそれを機能させることができないことです。

var req = new HttpRequestMessage(HttpMethod.Delete, url);
req.Headers.IfMatch.Add(
    new EntityTagHeaderValue("3-789d4d2b33bf4505f8f23fd4a1025a4e"));

これEntityTagHeaderValueにより、フォーマット例外が発生します。

「値 '3-789d4d2b33bf4505f8f23fd4a1025a4e' の形式は無効です。」

を介して純粋な文字列を使用して追加しようとしましたがreq.Headers.Add(string, string)、まだ運がありません。

私が見つけた実用的な解決策は次のとおりです。

req.Headers.TryAddWithoutValidation("If-Match", rev);

問題は、If-Matchヘッダーの要件は何ですか?

4

1 に答える 1

5

このタグは、HTTP 仕様のセクション 3.11 でentity-tag定義されているように である必要があり、さらに、HTTP 仕様のセクション 2.2 を参照)として定義され、オプションで「弱い」タグを示すために が前に付けられます。大まかに言えば、これはほとんどすべてのテキストを使用できますが、二重引用符で囲む必要があることを意味します。(存在する場合、プレフィックスは開始引用符の前に来ます。) 引用符内のテキストは、制御文字または ". 以外の任意のテキストにすることができます (また、 aが前にある場合、 a を表示できます)。quoted-stringW/W/"\

HTTP サーバーが ETag を報告する場合3-789d4d2b33bf4505f8f23fd4a1025a4e、仕様に違反しています。それは本当にのようなものでなければなりません"3-789d4d2b33bf4505f8f23fd4a1025a4e"

とはいえ、エンティティ タグに引用符がないことはよくあることのようです。どうやらHttpClientルールを強制するのは少し珍しいので、ルールに違反するサーバーに対処する必要がある場合は少し面倒です.

仕様にバグがあることに注意してください。公開された HTTP 1.1 仕様では、引用符で囲まれた文字列をバックスラッシュで終わらせることができ"foo\"ます"\"。しかし、これは意図したものではありませんでした。意図は、バックスラッシュの後に常に別の文字が続き、\最後の 2 つの例が違反しているように、前に を付けないことで終了引用符を区別することでした。このバグレポートを参照してください。これは、HTTP 1.1 仕様の次のバージョンの現在のドラフトで修正されています (HTTP bis は、Web 標準と同様に、10 年以内に公開される予定です)。したがって、これらの 2 つの文字列は現在技術的には合法ですが、実装者はそのようなことを避けるのが賢明です。

于 2013-06-27T13:35:28.297 に答える