我正在使用.Net 4.5中的System.Net.Http.HttpClient
和CouchDb。
我的文档revision
为3-789d4d2b33bf4505f8f23fd4a1025a4e
。
问题是我无法使用请求上的If-Match
标头标记。
var req = new HttpRequestMessage(HttpMethod.Delete, url);
req.Headers.IfMatch.Add(
new EntityTagHeaderValue("3-789d4d2b33bf4505f8f23fd4a1025a4e"));
EntityTagHeaderValue
导致格式异常:
“值'3-789d4d2b33bf4505f8f23fd4a1025a4e'的格式无效。”
我试图通过req.Headers.Add(string, string)
使用纯字符串添加它,但仍然没有运气。
我找到的工作解决方案是:
req.Headers.TryAddWithoutValidation("If-Match", rev);
问题是,If-Match
标题有哪些要求?
答案 0 :(得分:4)
标记必须是section 3.11 of the HTTP specification中定义的entity-tag
,后者又将其定义为quoted-string
(请参阅section 2.2 of the HTTP specification),可选地以{{}开头1}}表示'弱'标签。粗略地说,这意味着它几乎可以是任何文本,但它必须用双引号括起来。 (如果存在,W/
前缀出现在开头引号之前。)引号内的文本可以是除控制字符或“。”之外的任何内容。(如果前面有{{1},则允许出现W/
}})。
如果HTTP服务器将ETag报告为"
,那么它违反了规范。它应该是\
。
也就是说,实体标签缺少引号似乎很常见。显然3-789d4d2b33bf4505f8f23fd4a1025a4e
在执行规则方面有点不寻常,如果你不得不处理违反规则的服务器,那就太麻烦了。
请注意,规范中存在错误。已发布的HTTP 1.1规范允许带引号的字符串以反斜杠结尾,例如"3-789d4d2b33bf4505f8f23fd4a1025a4e"
或甚至HttpClient
。但是,这不是意图。目的是反斜杠总是后跟另一个字符,并且结束引用将通过不在"foo\"
前面来区分,这是最后两个例子违反的。见this bug report。它已经在HTTP 1.1规范的下一版本的当前草案中得到修复(HTTP bis,它似乎是Web标准的方式,现在将在任何十年出版)。因此,虽然这两个字符串在技术上是合法的,但实现者应该明智地避免这种情况。