我在. 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(Ubuntu 16.04服务器与. Net Core 1.0.4)上运行相同的代码时,我从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的内容类型头,但是不知何故,在. 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自动添加内容类型头?
我尝试过的:
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.'
1条答案
按热度按时间2exbekwf1#
您正在执行POST。这将为通常需要的正文添加默认内容类型。
不清楚规范是否要求主体,但这是POST优于GET的一点,有时根据需要实现(尽管当然它可能是空白)。鉴于此,我怀疑.net总是添加一个内容类型头来给予主体意义。https://www.rfc-editor.org/rfc/rfc9110.html#name-method-definitions
这个请求可能是一个不需要主体的GET,也可能有其他的方法来发出请求,从而对请求的构造给予更多的控制。