C# 如何在消息';谁的反应?
我开发了一个ASP.NET核心中间件解决方案,它计算与我正在执行的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.
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;