C#,HTTPClient-IfMatch格式要求?

C#,HTTPClient-IfMatch格式要求?,c#,couchdb,httpclient,C#,Couchdb,Httpclient,我将.NET4.5中的System.Net.Http.HttpClient与CouchDb结合使用 我有一份文件的修订版:3-789d4d2b33bf4505f8f23fd4a1025a4e 问题是,我无法让它与请求上的If Match头标志一起工作 var req = new HttpRequestMessage(HttpMethod.Delete, url); req.Headers.IfMatch.Add( new EntityTagHeaderValue("3-789d4d2b3

我将.NET4.5中的
System.Net.Http.HttpClient
与CouchDb结合使用

我有一份文件的
修订版
: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
标题的要求是什么?

标签必须是中定义的
实体标签
,而实体标签又将其定义为
带引号的字符串
(请参阅),可以选择前面加上
W/
,以指示“弱”标签。粗略地说,这意味着它几乎可以是任何文本,但必须用双引号括起来。(如果存在,
W/
前缀位于开始引号之前。)引号中的文本可以是除控制字符或“.”之外的任何字符(如果前面有
\
,则允许出现

如果HTTP服务器将ETag报告为
3-789d4d2b33bf4505f8f23fd4a1025a4e
,则它违反了规范。它应该类似于
“3-789d4d2b33bf4505f8f23fd4a1025a4e”

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

请注意,规范中存在一个bug。已发布的HTTP 1.1规范允许引用字符串以反斜杠结尾,例如,
“foo\”
,甚至仅
“\”
。然而,这不是目的。这样做的目的是,反斜杠后面总是跟有另一个字符,结束引号的区别在于前面没有
\
,这是最后两个示例所违反的。看见在下一个版本的HTTP 1.1规范(HTTP bis,这似乎是web标准的方式,现在任何十年都将发布)的当前草案中,它已经被修复。因此,尽管这两个字符串在当今技术上是合法的,但实现者还是明智地避免这类事情