1

在升级 .NET 框架之前,我有一个运行良好的控制台应用程序。控制台应用程序调用 Web API。它曾经使用 Newtonsoft.Json。由于 System.Net.Http.dll (.NET 4.5.2) 中不再有PostAsJsonAsync方法,因此必须替换 PostAsJsonAsync:

HttpResponseMessage responseMessage = await client.PostAsJsonAsync(url, myRequest);

根据HttpClient 不支持 PostAsJsonAsync 方法 C#的解决方案(而不是遵循接受的答案,我遵循用户评论的第二高投票答案应该是接受的答案),我试图用PostAsync替换它:

            var values = new Dictionary<string, string>
            {
                { "myRequestNo", myRequest.requestNo.ToString() },
                { "myImage", myRequest.image },
            };
            var json = JsonConvert.SerializeObject(values, Formatting.Indented);
            var stringContent = new StringContent(json);

            client.BaseAddress = new Uri(url);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
        var response = await client.PostAsync(url, stringContent);
        var responseString = await response.Content.ReadAsStringAsync();

我可以看到以下标头已成功添加到请求中:

从 Visual Studio

尽管添加了此标头,但我收到以下错误:

此资源不支持请求实体的媒体类型“text/plain”

我错过了什么?

4

2 回答 2

2

您的问题是您正在设置要接受 application/json

相反,您应该做的是声明 stringcontent 是 application/json 这是使用以下代码完成的:

stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

这告诉服务器它可以在正文中预期的内容类型是“application/json”

于 2019-08-14T13:48:44.393 回答
0

消除:

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

并将其替换为:

client.DefaultRequestHeaders.Add("ContentType", "application/json");
于 2019-08-14T14:01:27.500 回答