【问题标题】:Removing Content-Type header in .NET Core删除 .NET Core 中的 Content-Type 标头
【发布时间】: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 无关。但是带空间的选项仍然可以工作。

标签: c# .net linux .net-core


【解决方案1】:

你正在做一个 POST。这会为通常需要的正文添加默认内容类型。

尚不清楚规范是否要求主体,​​但这是 POST 而非 GET 的要点,有时会根据需要实施(当然它可能是空白的)。鉴于此,我怀疑.net 总是添加一个内容类型的标头来赋予该主体含义。 https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

这个请求可能应该是一个不需要正文的 GET。也可能有其他方法可以发出请求,从而可以更好地控制请求的构造。

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多