我有一个问题
HttpClient.PostAsJsonAsync()

除了“Content-Type” header 中的“application/json”之外,该方法还添加了“charset = utf-8”

所以标题看起来像这样:

内容类型:application/json;字符集= utf-8

虽然ASP.NET WebAPI与此 header 没有任何问题,但我发现作为客户端使用的其他WebAPI不会接受带有此 header 的请求,除非它只是application/json。

无论如何,使用PostAsJsonAsync()时,是否可以从Content-Type中删除“charset = utf-8”,还是应该使用其他方法?

解决方案:
归功于Yishai!

using System.Net.Http.Headers;

public class NoCharSetJsonMediaTypeFormatter : JsonMediaTypeFormatter
{
   public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
   {
       base.SetDefaultContentHeaders(type, headers, mediaType);
       headers.ContentType.CharSet = "";
   }
}

public static class HttpClientExtensions
{
    public static async Task<HttpResponseMessage> PostAsJsonWithNoCharSetAsync<T>(this HttpClient client, string requestUri, T value, CancellationToken cancellationToken)
    {
        return await client.PostAsync(requestUri, value, new NoCharSetJsonMediaTypeFormatter(), cancellationToken);
    }

    public static async Task<HttpResponseMessage> PostAsJsonWithNoCharSetAsync<T>(this HttpClient client, string requestUri, T value)
    {
        return await client.PostAsync(requestUri, value, new NoCharSetJsonMediaTypeFormatter());
    }
}

最佳答案

您可以从JsonMediaTypeFormatter派生并覆盖SetDefaultContentHeaders。

调用base.SetDefaultContentHeaders(),然后清除headers.ContentType.CharSet
然后根据以下代码编写您自己的扩展方法:

public static Task<HttpResponseMessage> PostAsJsonAsync<T>(this HttpClient client, string requestUri, T value, CancellationToken cancellationToken)
{
    return client.PostAsync(requestUri, value,
            new JsonMediaTypeFormatter(), cancellationToken);
}

本质上是这样的:
public static Task<HttpResponseMessage> PostAsJsonWithNoCharSetAsync<T>(this HttpClient client, string requestUri, T value, CancellatioNToken cancellationToken)
{
    return client.PostAsync(requestUri, value,
          new NoCharSetJsonMediaTypeFormatter(), cancellationToken);
}

关于asp.net - 如何从HttpClient.PostAsJsonAsync()生成的Content-Type header 中删除charset = utf8?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23161088/

10-11 21:04