2

我将System.Net.Http.HttpClient.Net 4.5 中的内容与 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标头有什么要求?

4

1 回答 1

5

该标记必须是HTTP 规范第 3.11 节entity-tag中定义的 a,而后者又将其定义为 a (参见HTTP 规范第 2.2 节),前面可选地表示“弱”标记。粗略地说,这意味着它几乎可以是任何文本,但必须用双引号括起来。(如果存在,前缀出现在开始引号之前。)引号内的文本可以是除控制字符或“之外的任何内容。(如果前面有 a ,则允许出现 a )。quoted-stringW/W/"\

如果 HTTP 服务器报告 ETag,3-789d4d2b33bf4505f8f23fd4a1025a4e那么它违反了规范。它应该真的是这样的"3-789d4d2b33bf4505f8f23fd4a1025a4e"

也就是说,实体标签缺少引号似乎很常见。显然HttpClient在执行规则方面有点不寻常,如果您必须处理违反规则的服务器,这会有点麻烦。

请注意,规范中有一个错误。已发布的 HTTP 1.1 规范允许带引号的字符串以反斜杠结尾,例如,"foo\"甚至只是"\". 然而,这不是本意。目的是反斜杠后面总是跟着另一个字符,并且结束引号的区别在于前面没有 a \,这是最后两个示例违反的。请参阅此错误报告。它已在 HTTP 1.1 规范的下一版本的当前草案中得到修复(HTTP bis,似乎是 Web 标准的方式,现在将在任何十年发布)。因此,尽管这两个字符串在今天在技术上是合法的,但实现者最好避免这种事情。

于 2013-06-27T13:35:28.297 回答