我有一个问题
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/