C# System.Net.Http.HttpClient实例在设置逗号时引发异常。为什么?

C# System.Net.Http.HttpClient实例在设置逗号时引发异常。为什么?,c#,.net,http-headers,dotnet-httpclient,C#,.net,Http Headers,Dotnet Httpclient,给定以下System.Net.Http.HttpClient可移植类库引发异常: var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Add("Authorization", "aaaa,bbbb"); 例外情况是:无效格式 位于System.Net.Http.Headers.HttpHeaders.AddInternal(System.String 名称,IEnumerable1值,System.Net.Ht

给定以下
System.Net.Http.HttpClient
可移植类库
引发异常:

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", "aaaa,bbbb");
例外情况是:无效格式

位于System.Net.Http.Headers.HttpHeaders.AddInternal(System.String 名称,IEnumerable
1值,System.Net.Http.Headers.HeaderInfo
headerInfo,布尔信号无效[0x0004c]in
/Developer/MonoTouch/Source/mono/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs:195
在System.Net.Http.Headers.HttpHeaders.Add(System.String name,
IEnumerable中的[0x00011]值
/Developer/MonoTouch/Source/mono/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs:170
在System.Net.Http.Headers.HttpHeaders.Add(System.String name,
系统字符串值)[0x00000]英寸
/开发者/MonoTouch/Source/mono/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders
< ... 剪断…>

现在这只发生在以下情况下

标题键=
授权
。如果你把它换成别的,没关系。 Value=必须包含逗号

现在,前一个SO问题表明逗号是在标题中粘贴多个值的正确方法

有人能解释发生了什么事吗

注意:这是Xamarin的,所以我猜是mono。不知道这是否重要

更新:

这是它的一张照片

据英国《每日邮报》报道,用逗号分隔似乎确实有效

“它使用可扩展的不区分大小写的令牌来标识身份验证方案, 后跟以逗号分隔的属性值对列表 携带实现身份验证所需的参数 方案。”

但这表明您很可能设置错误,它们的形式必须是“属性-值对”:

你到底是怎么设置的

httpClient.DefaultRequestHeaders.Add("Authorization", "aaaa,bbbb");
上述内容似乎无效,它们不是属性对“aaaa,bbbb”。您尝试设置的两个属性都没有=符号

请尝试以下测试:

httpClient.DefaultRequestHeaders.Add("Authorization", "aaaa=1234,bbbb=45678");

mono实现中存在一个错误,它不允许在头中使用有效字符,即
[
]
-这已经被修复,但对于Xamarin Android来说,它还没有达到稳定的分支(Xamarin Android 5将附带它)

这是有可能绕过这一点,如果你不能等待,你需要立即发货,你需要在标题中有特殊字符,有一种方法(我现在已经放弃)

在添加标题之前,可以将字符作为允许的标记添加到标题中。这是未记录的、非法的(从正确的编码角度来看),并且是通过反射完成的,但它可以工作:

var assembly = typeof(System.Net.Http.Headers.HttpContentHeaders).Assembly;
var lexer = assembly.GetType("System.Net.Http.Headers.Lexer");
var field = lexer.GetField("token_chars", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
var tokens = ( bool[])field.GetValue(null);
tokens[91] = true;
tokens[93] = true;
field.SetValue(null, tokens);

在上面的示例中,我们分别允许使用字符91和93[和]。

这是堆栈跟踪,异常是什么?已更新。哎呀。关于这一点,soz表示。例外情况表明这是一种无效的格式。为什么要在该标题中设置逗号?@CodeCaster,因为我想并且相信它是有效的。但是我想为授权字段设置的值是“aaa,bbb”。。不是键/值结果。然后,只有我的服务器,我用逗号分割该值,并假设第一个段是Foo,第二个段是Bah。好吧,你不能,你必须考虑其他的东西。也许您可以对值进行base64编码。这只是用于授权标头吗?或-any-header?如果您希望有一个指定格式的头,则创建一个自定义头,但该方法存在缓存控制问题,或者只放置一些伪数据以使其成为键值对,例如1=aaaa, 2=bbbb@Pure.Kromeauth参数可以是名称/值对,也可以是逗号不是有效字符的值。请注意,在更新了Mono(版本5)的较新Android上,上述代码将失败。它不再需要了。如果您确实需要支持较旧的Mono框架,请在使用答案之前测试版本>5。
var assembly = typeof(System.Net.Http.Headers.HttpContentHeaders).Assembly;
var lexer = assembly.GetType("System.Net.Http.Headers.Lexer");
var field = lexer.GetField("token_chars", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
var tokens = ( bool[])field.GetValue(null);
tokens[91] = true;
tokens[93] = true;
field.SetValue(null, tokens);