我必须连接到需要许多不同 header 的 RESTAPI。其中之一给我带来了问题,因为它的名称在括号内 - header 名称是“(request-target)”。
这是我的代码,但是当我点击要添加此值的行时 - 它显示“ header 名称格式无效”
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("(request-target)", "host date");
client.DefaultRequestHeaders.Date = DateTime.Now;
client.DefaultRequestHeaders.Host = "localhost:50414";
int count = client.DefaultRequestHeaders.Count();
我试过了
client.DefaultRequestHeaders.TryAddWithoutValidation("(request-target)", "host date");
它不会失败 - 但我对 header 数量的计数不包括此 header 。我试过这段代码 - 它给了我关于“标题名称格式无效”的相同错误
HttpRequestMessage httpreqmsg = new HttpRequestMessage();
httpreqmsg.Headers.Add("(request-target)", "host date");
谁能告诉我如何在我发疯之前解决这个问题!
谢谢磨坊。
进一步更新
他们提供了一个 java 代码 - 用于提取 header 详细信息并且名称肯定包含方括号。 header 用于构建使用数字证书中的 key 签名的字符串。
public String buildStringToBeSigned(HttpServletRequest request, List<String> signatureHeaders) {
Integer counter = 0;
StringBuilder sb = new StringBuilder();
for (String s : signatureHeaders) {
counter++;
if ("(request-target)".equalsIgnoreCase(s)) {
sb.append(s + ": " + request.getMethod().toLowerCase()
+ " " + request.getRequestURI() + (counter < signatureHeaders.size() ? "\n" : ""));
}else{
sb.append(s + ": " + request.getHeader(s) + (counter < signatureHeaders.size() ? "\n" : ""));
}
}
return sb.toString();
}
最佳答案
所以发生的事情是在 HttpHeaders
打电话时上课 DefaultRequestHeaders.Add
它调用一个名为 CheckHeaderName
的私有(private)方法.
在里面,它会根据您的案例 (request-target)
中的 header 键进行验证.
首先,它检查它是否为空,然后检查称为 TokenLength
的东西。 .基本上,此检查遍历 header 键的每个字符并检查一堆 TokenChars
.以下char
不允许:
40
41
60
62
64
44
59
58
92
34
47
91
93
63
61
123
125
和字符(
和 )
都等于 40
和 41
.
所以它看起来像是被烘焙到 .Net 框架中,标题键不允许用于上述任何字符。
TokenLength
当您调用 TryAddWithoutValidation
时也会调用 check . TryAddWithoutValidation
如果 header 已添加到集合中,也会返回一个 bool 值,因此您可以在代码中使用它来查看它是否已添加。
注意:这是针对 .Net Framework 4.7.2 检查的
更新:
因为查看 .Net Core 源代码更容易,所以我也查看了那里是否有任何更改,它的逻辑几乎相同。
您可以看到不允许的值 here 它检查 header 键是否具有其值 here这是从 here 调用的,因为它将返回 false,因为它包含无效字符,因此将抛出异常。
关于c# - 带括号的 HttpClient 自定义 header - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51038678/