如何在 C# 中使用不带字符集的 DataContractJsonSerializer 发送 JSON?

问题描述 投票:0回答:3

我使用

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
上有超载,可以做到这一点。

c# datacontractjsonserializer
3个回答
12
投票

当通过 初始化 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;
    }
}

8
投票

我一直遇到完全相同的问题,无论我将字符集设置为什么,它总是声称我正在尝试使用“不支持的媒体类型”。我发现使用这种将字符集留空的方法(正如 Slack 试图做的那样)解决了我的问题。诀窍是指定内容类型 - 这是绝对必需的 - 稍后(我只是在下一行做了):

StringContent content = new StringContent("Whatever=something");
content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");

(请原谅内容的非真正 JSON 格式,这不是我的示例的重点。)


0
投票

您还可以将 JsonContent 与 MediaType 参数一起使用:

var jsonContent = JsonContent.Create(new
            {
                something = "else"
            }, 
mediaType: new MediaTypeHeaderValue("application/json") {CharSet = null });
© www.soinside.com 2019 - 2024. All rights reserved.