2017-10-24 10 views
3

私は実行している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; 

この方法では、文字列はエスケープされず、それを直接後続の要求にコピー&ペーストすることができます。

+0

私の前回の回答で私の想いが間違っていたようですが、ここで何が問題なのですか? Eタグには引用符を付ける必要があり、ヘッダーにある 'ToString()'はそれらの引用符をエスケープします。どうしましたか? –

+0

唯一の問題は、このヘッダーを別の要求に直接コピーしようとした場合です(つまり、curl -X GET --header 'Accept:application/json' --header 'If-None-Match: "c96GUyc4QBo5w ..)ggSdPkEdgB1i56Qcs = \ "" '...)、要求は失敗します。それがうまくいくと思われ、エスケープされた文字列を解析する手作業をしなければならない場合、私はそれを使って作業します。 –

+0

それをさらに調べると、 "" "" "c96GUyc4QBo5w(...)ggSdPkEdgB1i56Qcs = \" "' JSONオブジェクト内の文字列を表す方法のようです@ JonHannaあなたのコメントをトップレベルの回答ですので、回答として受け入れることができますか?ありがとうございます。 –

答えて

1

これはちょうどToString()が物を表す方法の問題です。これはJSONフォームを提供するため、引用符はエスケープされ、E-Tagsは引用符(*を除く)が必要なため、エスケープされた引用符があるという結果になります。引用符はHTTPの実際のEタグ・ヘッダーとしてエスケープされません。

関連する問題