C# 如何在消息';谁的反应?

C# 如何在消息';谁的反应?,c#,asp.net,swagger,etag,C#,Asp.net,Swagger,Etag,我开发了一个ASP.NET核心中间件解决方案,它计算与我正在执行的GET请求匹配的ETag值,并在响应中返回它 相关代码摘录如下: RequestHeaders requestHeaders = new RequestHeaders(actionContext.HttpContext.Request.Headers); ResponseHeaders responseHeaders = new ResponseHeaders(actionContext.HttpContext.Response.

我开发了一个ASP.NET核心中间件解决方案,它计算与我正在执行的
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 Match
If None Match
头中,用于后续响应

但是,我缺少了一些C#的特殊性,比如在通过Swagger进行测试时,响应的标题具有奇怪的格式,就好像我在对C#属性执行
.ToString()

...
"date": "Tue, 24 Oct 2017 15:08:39 GMT",
"etag": "\"c96GUyc4QBo5w(...)ggSdPkEdgB1i56Qcs=\"",
"server": "Kestrel",
...
有没有办法避免HTTP响应头中转义的
\“
,或者我应该确保我的客户端都理解这个限制并正确解析字符串

发送其他标题时,输入格式为不带
\“
的字符串,这将需要大量额外的转换工作

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


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

这只是
ToString()
如何表示的问题。因为它提供了一个JSON格式,引号被转义,并且因为电子标签需要引号(除了
*
),所以结果是有转义引号。不过,在HTTP中,引号并没有作为实际的E-Tag头转义。

看来我在上一个回答中的记忆是不正确的,但请重新阅读,这里有什么问题?电子标签周围必须有引号,标题上的
ToString()
转义这些引号。出什么问题了?唯一的问题是,如果我要将此标头直接复制到另一个请求中(即curl-X GET--header'Accept:application/json'--header'if None匹配:“\”C96GYC4QBO5W(…)ggSdPkEdgB1i56Qcs=\”…),则请求将失败。如果这是它应该如何工作的,我必须手动解析转义字符串,我将使用它。进一步研究,
“etag”:“\”C96GYC4QBO5W(…)ggSdPkEdgB1i56Qcs=\”
似乎是用“在JSON对象中@JonHanna你能把你的评论作为一个顶级的回答,这样我就可以接受它作为回应吗?谢谢
actionContext.HttpContext.Response.Headers[HeaderNames.ETag] = eTag;