C#、HTTPClient - IfMatch 格式要求?

Dan*_*iel 2 c# couchdb httpclient

我将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"));
Run Code Online (Sandbox Code Playgroud)

EntityTagHeaderValue导致格式异常:

“值‘3-789d4d2b33bf4505f8f23fd4a1025a4e’的格式无效。”

我尝试通过以下方式使用纯字符串添加它:req.Headers.Add(string, string),仍然没有运气。

我找到的工作解决方案是:

req.Headers.TryAddWithoutValidation("If-Match", rev);
Run Code Online (Sandbox Code Playgroud)

问题是,对If-Match标题有什么要求?

Ian*_*ths 5

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

如果 HTTP 服务器将 ETag 报告为3-789d4d2b33bf4505f8f23fd4a1025a4e违反规范。它真的应该像"3-789d4d2b33bf4505f8f23fd4a1025a4e".

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

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