2014-05-08 28 views
5

我試圖使用System.Net.HttpClient類將消息發佈到Google Cloud Messaging。將自定義字符串放入System.Net.HttpClient的「授權」標題中

谷歌雲消息需要你有一個名爲「授權」頭,在類似這樣的格式:

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。該消息是

值「鍵= AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0LJ0w」的格式是 無效。

而且調用堆棧是:

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) 

我怎樣才能得到這頭到無例外這個post請求被拋出?


順便說一句,我已經由一個像這樣的帖子使用招,和它的作品:

頁眉:

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

請求正文:

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

你是否嘗試在頭上設置'Authorization'屬性,而不是嘗試'添加'一個新的? –

+0

並且還'client.DefaultRequestHeaders.Authorization =新AuthenticationHeaderValue( 「鍵」, 「AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0LJ0w」);' –

+0

@Joel艾裏:我嘗試的是,然後將報頭是 「鍵AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0LJ0w」。它不包含'='標誌。 –

回答

4

那是因爲你的價值打破了HTTP規範。

頭應該包含Authorization: scheme SPACE value如下所述:http://www.ietf.org/rfc/rfc2617.txt

你的情況:

Authorization: key AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0Lu8D 
+2

它可能會違反規範,但不幸的是,我必須讓Google Cloud Messaging服務器接受我的信息。 –

+2

那麼你需要使用'HttpWebRequest'類來代替。 – jgauffin

+2

httpClient.DefaultRequestHeaders.TryAddWithoutValidation(「Authorization」,「key = XXX」); 請參閱http://stackoverflow.com/a/24575721/143195 – JCallico