我使用
DataContractJsonSerializer
和 StringContent
将 JSON 发送到 Web 服务:
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Employee));
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, employee);
ms.Position = 0;
StreamReader sr = new StreamReader(ms);
StringContent jsonContent = new StringContent(sr.ReadToEnd(),
System.Text.Encoding.UTF8, "application/json");
// later I do HttpClient.PostAsync(uri, jsonContent)
这会产生以下 Content-Type 标头:
Content-Type: application/json; charset=utf-8
是否可以省略 charset 而只包含以下标头?
Content-Type: application/json
我没有看到
StringContent
上有超载,可以做到这一点。
当通过 初始化 StringContent 类
的新实例时public StringContent(
string content,
Encoding encoding,
string mediaType
)
生成以下
Content Type
的 HTTP 请求标头:
Content-Type: application/json; charset=utf-8
注意编码部分的存在(
)charset=utf-8
为了构造
Content Type
标头没有编码部分,可以考虑以下选项:
1) 使用 StringContent 构造函数(字符串) 并使用 ContentType 属性 设置内容类型,例如:
var requestContent = new StringContent(jsonContent);
requestContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
或
var requestContent = new StringContent(jsonContent);
requestContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
2) 从ContentType属性中删除编码部分,例如:
var requestContent = new StringContent(jsonContent, System.Text.Encoding.UTF8, "application/json");
requestContent.Headers.ContentType.CharSet = null;
3) 创建自定义 JsonMediaTypeFormatter 类 重置编码部分:
public class NoCharsetJsonMediaTypeFormatter : JsonMediaTypeFormatter
{
public override void SetDefaultContentHeaders(Type type, System.Net.Http.Headers.HttpContentHeaders headers, System.Net.Http.Headers.MediaTypeHeaderValue mediaType)
{
base.SetDefaultContentHeaders(type, headers, mediaType);
headers.ContentType.CharSet = null;
}
}
我一直遇到完全相同的问题,无论我将字符集设置为什么,它总是声称我正在尝试使用“不支持的媒体类型”。我发现使用这种将字符集留空的方法(正如 Slack 试图做的那样)解决了我的问题。诀窍是指定内容类型 - 这是绝对必需的 - 稍后(我只是在下一行做了):
StringContent content = new StringContent("Whatever=something");
content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
(请原谅内容的非真正 JSON 格式,这不是我的示例的重点。)
您还可以将 JsonContent 与 MediaType 参数一起使用:
var jsonContent = JsonContent.Create(new
{
something = "else"
},
mediaType: new MediaTypeHeaderValue("application/json") {CharSet = null });