如何 return 消息响应中的有效 ETag?

How do I return a valid ETag in a message's response?

我开发了一个 ASP.NET 核心中间件解决方案,它计算与我正在执行的 GET 请求相匹配的 ETag 的值,并在响应中 returns 。

相关代码摘录如下:

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 };

使用此代码,我可以成功地 return HTTP 消息中的 ETag 响应,并将该 ETag 放入 If-MatchIf-None-Match header 后续回复。

但是,我遗漏了一些 C# 的特殊性,因为当通过 Swagger 进行测试时,响应的 headers 具有奇怪的格式,就好像我在 C# 上执行 .ToString() 属性:

...
"date": "Tue, 24 Oct 2017 15:08:39 GMT",
"etag": "\"c96GUyc4QBo5w(...)ggSdPkEdgB1i56Qcs=\"",
"server": "Kestrel",
...

有没有办法避免 HTTP 响应 header 中的转义 \",或者我应该确保我的客户都理解这个限制并正确解析字符串?

发送其他header时,输入格式是没有\"的字符串,这会增加很多额外的转换工作。

编辑: 我发现了另一种设置 ETag 的方法,它不太直接并且不检查类型(即我不必使用 EntityTagValue 并且可以直接使用字符串)

actionContext.HttpContext.Response.Headers[HeaderNames.ETag] = eTag;

这样,字符串不会被转义,我可以copy-paste它直接进入进一步的请求。

这只是ToString()如何表示事物的问题。因为它给出了 JSON 形式,引号被转义了,并且因为 E-Tags 需要引号(除了 *),结果是有转义引号。尽管在 HTTP 中引号没有像实际的 E-Tag headers 一样被转义。