【发布时间】:2017-10-08 23:51:48
【问题描述】:
我在 .Net Core 中有以下代码:
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer " + _accessToken);
client.DefaultRequestHeaders.TryAddWithoutValidation("Dropbox-API-Arg", GenerateJsonFromObject(new {path = filePath}));
var request = new HttpRequestMessage(HttpMethod.Post, "https://content.dropboxapi.com/2/files/download");
var result = client.SendAsync(request).Result;
}
正如您所见,这是一段非常简单的代码,并且可以正常工作,但仅适用于 Windows。 当我在我的 Linux VPS(带有 .Net Core 1.0.4 的 Ubuntu 16.04 服务器)上运行相同的代码时,我从 Dropbox API 收到以下错误消息:
Error in call to API function "files/download": You provided a non-empty HTTP "Content-Type" header ("application/x-www-form-urlencoded"). This API function requires that the header be missing or empty.
所以 API 需要空或 null Content-Type 标头,但不知何故在 .Net Core 中,此标头会自动添加到我的请求中。
打印请求头的结果在 Windows 和 Linux 上是一样的:
Method: POST, RequestUri: 'https://content.dropboxapi.com/2/files/download', Version: 1.1, Content: <null>, Headers:
{
Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Dropbox-API-Arg: {"path":"/tracklogs/night_ride.gpx"}
}
所以我的问题是: 如何避免 .Net Core 自动添加 Content-Type 标头?
我尝试过的:
1 设置一个空的 Content-Type 标头:
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "");
不起作用,即使我将标头的值设置为“application/json”,它也会自动更改为 application/x-www-form-urlencoded :(
2 删除整个标题:
request.Headers.Remove("Content-Type");
或:
client.DefaultRequestHeaders.Remove("Content-Type");
在这两种情况下,我都会收到以下异常:
Misused header name. Make sure request headers are used with HttpRequestMessage, response headers with HttpResponseMessage, and content headers with HttpContent objects.'
【问题讨论】:
-
@Boggin 这不是重复的 - 正如您所读到的,我尝试将 Header 值设置为 application/json (甚至设置为空间),但是 .net 核心以某种方式覆盖了这一点,它正在改变价值。
-
您需要更新您的问题,因为它没有说明您使用空格字符进行了测试。
-
链接问题与 .Net 无关。但是带空间的选项仍然可以工作。