2014-05-08 17 views
5

Tôi đang cố sử dụng lớp System.Net.HttpClient để đăng tin nhắn lên Google Cloud Messaging.Đặt chuỗi tùy chỉnh vào tiêu đề "Ủy quyền" trong System.Net.HttpClient

Google Cloud nhắn đòi hỏi bạn phải bao gồm một tiêu đề gọi là "ủy quyền", trong một định dạng tương tự như sau:

key=AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0Lu8D 

Nhưng lớp HttpClient ném một ngoại lệ khi tôi cố gắng này.

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

Ngoại lệ là loại System.FormatException. Thông điệp là

Định dạng của giá trị 'key = AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0LJ0w' là không hợp lệ.

Và callstack là:

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) 

Làm thế nào tôi có thể nhận được tiêu đề này vào bài yêu cầu này mà không có một ngoại lệ được ném?


Ngẫu nhiên, tôi đã sáng tác một bài như thế này sử dụng Fiddler, và nó hoạt động:

Headers:

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

Request Body:

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

Bạn đã cố gắng đặt thuộc tính 'Ủy quyền' trên tiêu đề thay vì cố gắng' Thêm' một cái mới? –

+0

Và cũng 'client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("key", "AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0LJ0w"); ' –

+0

@Joel Allison: Tôi cố gắng đó, và sau đó là tiêu đề là "chìa khóa AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0LJ0w". Nó không bao gồm dấu '='. –

Trả lời

4

Đó là bởi vì giá trị của bạn là phá vỡ đặc tả HTTP.

Các tiêu đề phải chứa Authorization: scheme SPACE value như đã mô tả ở đây: http://www.ietf.org/rfc/rfc2617.txt

Trong trường hợp của bạn:

Authorization: key AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0Lu8D 
+2

Nó có thể phá vỡ đặc điểm kỹ thuật, nhưng tiếc là đó là những gì tôi phải đưa vào để có được máy chủ Google Cloud Messaging chấp nhận thông điệp của tôi. –

+2

thì bạn cần sử dụng lớp 'HttpWebRequest' thay thế. – jgauffin

+2

httpClient.DefaultRequestHeaders.TryAddWithoutValidation ("Ủy quyền", "khóa = XXX"); Xem http://stackoverflow.com/a/24575721/143195 – JCallico

Các vấn đề liên quan