将自定义字符串放在System.Net.HttpClient的“Authorization”标头中

时间:2014-05-08 07:07:59

标签: .net dotnet-httpclient google-cloud-messaging

我正在尝试使用System.Net.HttpClient课程向Google Cloud Messaging发送消息。

Google Cloud Message要求您包含名为“授权”的标头,其格式类似于:

key=AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0Lu8D

但是当我尝试这个时,HttpClient类会引发异常。

string keyString = "key=AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0LJ0w";
using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add("Foo", keyString); // <== Proving I can
    client.DefaultRequestHeaders.Add("Authorization", keyString); // Exception thrown

例外类型为System.FormatException。消息是

  

值'key = AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0LJ0w'的格式为   无效。

并且callstack是:

at System.Net.Http.Headers.HttpHeaderParser.ParseValue(String value, Object storeValue, Int32& index)
at System.Net.Http.Headers.HttpHeaders.ParseAndAddValue(String name, HeaderStoreItemInfo info, String value)
at System.Net.Http.Headers.HttpHeaders.Add(String name, String value)

如何在不抛出异常的情况下将此标头添加到此帖子请求中?

<小时/> 顺便说一下,我使用Fiddler编写了一个这样的帖子,它可以工作:

接头:

User-Agent: Fiddler
Authorization: key=AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0Lu8D
Host: android.googleapis.com
Content-Length: 220
Content-Type: application/json

请求正文:

{
 "registration_ids" : ["APA91bEM6XPdiZv5VgNNApakfyYfZwB871018Hljl1L27kaPvksasnR0bHlmcCZFxOSPD6bDLMZgvgfT9xsKnF6Tg0oSQM2cMM1KRbuK7cR7jICqAnSDYg_SvERTzPMT8puXGTlVkEVH6dsneBkXiBu6pZikWXWyRATAVbXnAHTe20-nQerb0"],
}

2 个答案:

答案 0 :(得分:7)

请尝试此答案:

https://stackoverflow.com/a/24575721/1981387

看起来像是一个变通方法,因为它是一个字符串对而不是一个好的对象,但它似乎有效。

答案 1 :(得分:4)

那是因为你的价值违反了HTTP规范。

标题应包含Authorization: scheme SPACE value,如下所述:http://www.ietf.org/rfc/rfc2617.txt

在你的情况下:

Authorization: key AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0Lu8D