4

我使用DataContractJsonSerializer并将StringContentJSON 发送到 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

是否可以省略字符集而只使用以下标题?

Content-Type: application/json

我没有看到这样做的过载StringContent

4

2 回答 2

10

StringContent 类的新实例通过以下方式初始化时

public StringContent(
    string content,
    Encoding encoding,
    string mediaType
)

生成以下 HTTP 请求标头Content Type

Content-Type: application/json; charset=utf-8

注意编码部分(charset=utf-8)的存在

为了构造不带编码部分Content Type的标头,可以考虑以下选项:

1)使用StringContent 构造函数 (String)并使用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;
    }
}
于 2015-05-24T19:14:36.437 回答
8

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

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

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

于 2014-03-04T01:17:34.013 回答