Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带括号的HttpClient自定义标头-C#_C#_.net_Visual Studio_Httpclient - Fatal编程技术网

带括号的HttpClient自定义标头-C#

带括号的HttpClient自定义标头-C#,c#,.net,visual-studio,httpclient,C#,.net,Visual Studio,Httpclient,我必须连接到一个RESTAPI,它需要许多不同的头。其中一个给我带来了一个问题,因为它的名称在括号内-头名称是“(请求目标)” 这是我的代码,但当我点击要添加此值的行时,会显示“标题名称格式无效” 我试过了 client.DefaultRequestHeaders.TryAddWithoutValidation("(request-target)", "host date"); 它没有失败-但我的页眉数计数不包括此页眉。我试过这段代码-它给了我关于“头名称格式无效”的相同错误 谁能告诉我在我发

我必须连接到一个RESTAPI,它需要许多不同的头。其中一个给我带来了一个问题,因为它的名称在括号内-头名称是“(请求目标)”

这是我的代码,但当我点击要添加此值的行时,会显示“标题名称格式无效”

我试过了

client.DefaultRequestHeaders.TryAddWithoutValidation("(request-target)", "host date");
它没有失败-但我的页眉数计数不包括此页眉。我试过这段代码-它给了我关于“头名称格式无效”的相同错误

谁能告诉我在我发疯之前该怎么做

谢谢你的帮忙

进一步更新

他们提供了一个java代码,用于提取标题详细信息,名称中肯定包含括号。标头用于构建一个字符串,该字符串使用数字证书中的密钥进行签名

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();
}
公共字符串buildStringToDesign(HttpServletRequest请求,列出签名头){
整数计数器=0;
StringBuilder sb=新的StringBuilder();
用于(字符串s:签名负责人){
计数器++;
如果(“(请求目标)”.equalsIgnoreCase){
sb.append(s+“:”+request.getMethod().toLowerCase()
+“+request.getRequestURI()+(计数器
因此,在
HttpHeaders
类中,当您调用
DefaultRequestHeaders.Add时,它调用一个名为
CheckHeaderName
的私有方法

在这里面,它对您案例中的头键进行验证
(请求目标)
。 首先,它检查它是否为空,然后检查名为
TokenLength
的内容。基本上,此检查将遍历头键的每个字符,并检查一组
令牌字符。不允许使用以下
char
s:

40
41
60
62
64
44
59
58
92
34
47
91
93
63
61
123
125
字符
都等于
40
41

因此,在.Net framework中,上面的任何字符都不允许使用头键

调用
TryAddWithoutValidation
时,也会调用
TokenLength
检查
TryAddWithoutValidation
如果将标头添加到集合中,也会返回bool,因此您可以在代码中使用该bool查看是否已添加标头

注意:这是根据.Net Framework 4.7.2进行检查的

更新:

因为查看.Net核心源代码更容易,所以我也查看了一下,看看有没有什么变化,逻辑也差不多

您可以看到不允许的值
它检查头键是否具有从调用的值,因为它将返回false,因为它包含无效字符,异常将被抛出。

您确定这是头,还是意味着您应该用“请求目标”替换它?我怀疑是否有人会用如此明显无效的头来构建API。Hi-过程的一部分,是将所有头放入签名字符串中。他们提供了Java代码,用于提取头细节以构建字符串。我现在就发布这个。在我看来,它仍然可能是一个占位符,让你插入你的“请求目标”是什么。至少我希望是这样,当一个服务使用非正统约定(DataX,我在看你)时,我真的很讨厌。从那时起我得到了确认——他们在签名字符串中使用它,但在标题中没有。这里的文档非常混乱,或者我需要学习更多的术语!!花了一整天的时间来编写代码。好吧,那就不好了。您是否知道Java是否允许使用这些括号?我要回现场看看他们是否能澄清。感谢您花时间回答-非常感谢。@AnnR我不了解Java抱歉。问题是它不是一个有效的头。如果没有括号,它将是有效的。如果这回答了你的问题,请将此标记为答案。杰米,我在绿色的勾号上打了勾-对吗。第一次海报!你的回答很有启发性。再次感谢。这是正确的@AnnR谢谢!抱歉,无法解决您的问题,但希望您现在能够朝着正确的方向前进。欢迎来到StackOverflow!
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();
}
40
41
60
62
64
44
59
58
92
34
47
91
93
63
61
123
125