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

And*_*erd 6 .net dotnet-httpclient google-cloud-messaging

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

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

key=AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0Lu8D
Run Code Online (Sandbox Code Playgroud)

但是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
Run Code Online (Sandbox Code Playgroud)

例外是类型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)
Run Code Online (Sandbox Code Playgroud)

如何在没有抛出异常的情况下将此标头添加到此发布请求中?


顺便说一下,我使用Fiddler编写了一个这样的帖子,它有效:

头:

User-Agent: Fiddler
Authorization: key=AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0Lu8D
Host: android.googleapis.com
Content-Length: 220
Content-Type: application/json
Run Code Online (Sandbox Code Playgroud)

请求机构:

{
 "registration_ids" : ["APA91bEM6XPdiZv5VgNNApakfyYfZwB871018Hljl1L27kaPvksasnR0bHlmcCZFxOSPD6bDLMZgvgfT9xsKnF6Tg0oSQM2cMM1KRbuK7cR7jICqAnSDYg_SvERTzPMT8puXGTlVkEVH6dsneBkXiBu6pZikWXWyRATAVbXnAHTe20-nQerb0"],
}
Run Code Online (Sandbox Code Playgroud)

wel*_*gan 7

请尝试这个答案:

/sf/answers/1720300501/

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


jga*_*fin 6

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

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

在你的情况下:

Authorization: key AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0Lu8D
Run Code Online (Sandbox Code Playgroud)

  • 它可能会违反规范,但不幸的是,这是我必须输入的内容才能让 Google Cloud Messaging 服务器接受我的消息。 (3认同)
  • httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX"); 见 http://stackoverflow.com/a/24575721/143195 (3认同)
  • 那么你需要改用`HttpWebRequest`类。 (2认同)