如何在消息响应中返回有效的ETag?

3
我已经开发了一个ASP.NET Core中间件解决方案,它可以计算与我执行的GET请求相匹配的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响应,并将该ETag放入If-MatchIf-None-Match标头以供后续响应使用。
但是,在通过Swagger进行测试时,响应的标头具有奇怪的格式,就像我对C#属性执行了.ToString()操作一样,这里可能有一些我缺失的C#特殊性。
...
"date": "Tue, 24 Oct 2017 15:08:39 GMT",
"etag": "\"c96GUyc4QBo5w(...)ggSdPkEdgB1i56Qcs=\"",
"server": "Kestrel",
...

有没有避免 HTTP 响应头中转义字符 \" 的方法?还是我应该确保客户端都理解这个限制并正确解析字符串?
在发送其他标头时,输入格式是不带 \" 的字符串,这会增加很多额外的转换工作。
编辑: 我发现了一种更少直接并且不检查类型(即我不必使用 EntityTagValue,可以直接使用字符串)的设置 ETag 的替代方法。
actionContext.HttpContext.Response.Headers[HeaderNames.ETag] = eTag;

这样,字符串不会被转义,我可以直接将其复制粘贴到后续请求中。

{btsdaf} - Jon Hanna
{btsdaf} - José Maia
{btsdaf} - José Maia
1个回答

1
这只是关于ToString()如何表示事物的问题。因为它给出了JSON形式,所以引号被转义了,而且因为E-Tags需要引号(除了*),结果就是有转义的引号。但是在HTTP中,引号并没有作为实际的E-Tag头部进行转义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接