linux 正在删除.NET核心中的内容类型标头

ldioqlga  于 2023-02-18  发布在  Linux
关注(0)|答案(1)|浏览(119)

我在. 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.'
2exbekwf

2exbekwf1#

您正在执行POST。这将为通常需要的正文添加默认内容类型。
不清楚规范是否要求主体,但这是POST优于GET的一点,有时根据需要实现(尽管当然它可能是空白)。鉴于此,我怀疑.net总是添加一个内容类型头来给予主体意义。https://www.rfc-editor.org/rfc/rfc9110.html#name-method-definitions
这个请求可能是一个不需要主体的GET,也可能有其他的方法来发出请求,从而对请求的构造给予更多的控制。

相关问题