C#,HTTPClient - IfMatch格式要求?

时间:2013-04-09 15:33:36

标签: c# couchdb httpclient

我正在使用.Net 4.5中的System.Net.Http.HttpClient和CouchDb。

我的文档revision3-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标题有哪些要求?

1 个答案:

答案 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标准的方式,现在将在任何十年出版)。因此,虽然这两个字符串在技术上是合法的,但实现者应该明智地避免这种情况。