c# - 带括号的 HttpClient 自定义 header - C#

标签 c# .net visual-studio httpclient

我必须连接到需要许多不同 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

和字符()都等于 4041 .

所以它看起来像是被烘焙到 .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/

相关文章:

c# - DateTime.TryParseExact 加一分钟?

c# - 台球/台球三角

c# - 如何解决 AddJsonOptions 不包含 SerializerSettings - .NET 的定义

.net - 是否有全局命名的读写器锁?

c++ - 零大小数组不适用于模板

c# - 如何创建具有热插拔能力的松散耦合架构?

c# - 如何设置属性选择器的值 Expression<Func<T,TResult>>

c# - 将 C# 结构传递给 C++ 非托管 DLL 返回不正确的结果

c# - 如何在所描述的创建 C++ .Net dll 的技术中记录函数?

c++ - 类型名称不允许,应为)