我在.Net核心中有以下代码:
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 (带有.Net核心1.0.4的Ubuntu16.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需要空的Content-Type头,但在.Net核心中,这个头会自动添加到我的请求中。
在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核心自动添加Content-Type头?
我尝试过的:
1设置空的Content-Type标头:
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "");
将不起作用,即使我将header的值设置为"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.'
发布于 2021-12-01 16:59:36
你正在写一篇文章。这将为通常所需的正文添加默认的内容类型。
不清楚规范是否要求主体,但这是POST而不是GET的要点,有时会按要求实现(当然,它可能是空白的)。有鉴于此,我怀疑.net总是添加一个内容类型的头部来赋予主体含义。https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
可能这个请求应该是一个不需要主体的GET。还可能有其他方法来发出请求,这些方法可以更好地控制请求的构造。
https://stackoverflow.com/questions/43890647
复制相似问题