【问题标题】:Putting a custom string in "Authorization" header in System.Net.HttpClient将自定义字符串放入 System.Net.HttpClient 的“授权”标头中
【发布时间】:2014-05-08 07:07:58
【问题描述】:

我正在尝试使用 System.Net.HttpClient 类向 Google Cloud Messaging 发布消息。

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

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'的格式是 无效。

而调用栈是:

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"],
}

【问题讨论】:

  • 您是否尝试在标题上设置Authorization 属性而不是尝试Add 一个新属性?
  • 还有client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("key", "AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0LJ0w");
  • @Joel Allison:我试过了,然后标题是“key AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0LJ0w”。它不包含“=”符号。
  • 如果这是您真正的 API 密钥,您可能希望在公开后撤销它...

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


【解决方案1】:

试试这个答案:

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

似乎有点解决方法,因为它是一个字符串对而不是一个不错的对象,但它似乎工作。

【讨论】:

    【解决方案2】:

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

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

    在你的情况下:

    Authorization: key AIzaSyBxFuZ9IbtGbJHX6F5wdTc1mHnB7i0Lu8D
    

    【讨论】:

    • 这可能会违反规范,但不幸的是,我必须这样做才能让 Google Cloud Messaging 服务器接受我的消息。
    • 那么你需要改用HttpWebRequest类。
    • httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");见stackoverflow.com/a/24575721/143195
    猜你喜欢
    • 2017-07-23
    • 2011-12-09
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2011-02-23
    • 2013-03-06
    相关资源
    最近更新 更多