私は実行しているGET
リクエストと一致するETagの値を計算し、レスポンスで返すASP.NETコアミドルウェアソリューションを開発しました。メッセージの応答に有効なETagを返すにはどうすればよいですか?
関連するコードの抜粋は、以下である:このコードで
RequestHeaders requestHeaders = new RequestHeaders(actionContext.HttpContext.Request.Headers);
ResponseHeaders responseHeaders = new ResponseHeaders(actionContext.HttpContext.Response.Headers);
// return not modified for conditional GET and HEAD
if (requestHeaders.IfNoneMatch != null && (requestHeaders.IfNoneMatch.Any(val => val.Tag == eTag || val.Tag == "*")))
{
responseHeaders.ETag = new EntityTagHeaderValue(eTag);
actionContext.Result = new ObjectResult(null) { StatusCode = (int)HttpStatusCode.NotModified };
return;
}
responseHeaders.ETag = new EntityTagHeaderValue(eTag);
responseHeaders.CacheControl = new CacheControlHeaderValue() { MaxAge = TimeSpan.FromSeconds(600), Private = false };
、私は正常後続のためにHTTPメッセージ内のETag応答を返す、ならびにIf-Match
又はIf-None-Match
ヘッダにそれのETagを取得することができています反応。
闊歩を経由してテストするときに、私はC#のプロパティに.ToString()
をしていたかのように、レスポンスのヘッダは、奇妙なフォーマットを持っているようしかし、私が行方不明ですいくつかのC#の特殊性がある:
...
"date": "Tue, 24 Oct 2017 15:08:39 GMT",
"etag": "\"c96GUyc4QBo5w(...)ggSdPkEdgB1i56Qcs=\"",
"server": "Kestrel",
...
ですHTTPレスポンスヘッダーでエスケープされた\"
を回避する方法がありますか、またはクライアントがすべてこの制限を理解し、文字列を正しく解析できるようにする必要がありますか?
他のヘッダーを送信する場合、入力形式は\"
のない文字列です。これは多くの特別な変換作業になります。
EDIT: 私はあまり直接的だのETagを設定する別の方法を発見したと型をチェックしません(つまり、私はEntityTagValue
を使用する必要はありませんし、直接文字列を使用することができます)
actionContext.HttpContext.Response.Headers[HeaderNames.ETag] = eTag;
この方法では、文字列はエスケープされず、それを直接後続の要求にコピー&ペーストすることができます。
私の前回の回答で私の想いが間違っていたようですが、ここで何が問題なのですか? Eタグには引用符を付ける必要があり、ヘッダーにある 'ToString()'はそれらの引用符をエスケープします。どうしましたか? –
唯一の問題は、このヘッダーを別の要求に直接コピーしようとした場合です(つまり、curl -X GET --header 'Accept:application/json' --header 'If-None-Match: "c96GUyc4QBo5w ..)ggSdPkEdgB1i56Qcs = \ "" '...)、要求は失敗します。それがうまくいくと思われ、エスケープされた文字列を解析する手作業をしなければならない場合、私はそれを使って作業します。 –
それをさらに調べると、 "" "" "c96GUyc4QBo5w(...)ggSdPkEdgB1i56Qcs = \" "' JSONオブジェクト内の文字列を表す方法のようです@ JonHannaあなたのコメントをトップレベルの回答ですので、回答として受け入れることができますか?ありがとうございます。 –