【发布时间】:2017-09-29 18:29:46
【问题描述】:
我无法弄清楚 HttpClient 脚本出了什么问题。
当我使用 Fiddler 时,它可以工作,而且 AspNetCore MVC 不会抛出错误。
http://localhost:6004/api/XUnitExamplesTest/JsonStringMethod
Http-Get
User-Agent: Fiddler
Accept: text/json
Content-Type: text/json
Host: localhost:6004
Content-Length: 24
"{\"Color\": \"Green\"}"
但 HttpClient 脚本会导致 AspNetCore MVC 问题。
var sampleData = new XUnitSampleData() { Color = "Red" };
var contentType = "text/json";
var httpMethod = HttpMethod.Get;
var uriPath = "JsonStringMethod";
var jsonData = JsonConvert.SerializeObject(_sampleData, Formatting.None).ToString(); // JSON String. --> "{ \"Vin\" : \"foo\", \"Color\" : \"foo\" }"
var jsonRequest = string.Format("\"{0}\"", jsonData);
var result = await XUnitWebClient.GetAsync3(contentType, httpMethod, uriPath, jsonRequest, CancellationToken.None);
public static async Task<string> GetAsync3(string contentType, HttpMethod httpMethod, string uriPath, string request, CancellationToken cancellationToken)
{
using (var httpClient = new HttpClient())
{
using (var httpRequestMessage = new HttpRequestMessage(httpMethod, string.Format("{0}{1}", _uri, uriPath)))
{
httpClient.BaseAddress = new Uri(string.Format("{0}", _baseAddress));
//httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(contentType)); // "Accept" Header.
//httpClient.DefaultRequestHeaders.Remove("Content-Type");
//httpClient.DefaultRequestHeaders.Add("Content-Type", contentType);
httpRequestMessage.Content = new StringContent(request, Encoding.UTF8, contentType); // "Content-Type" Header.
var response = await httpClient.SendAsync(httpRequestMessage);
return await response.Content.ReadAsStringAsync();
}
}
}
AspNetCore MVC 得到的 JSON 值为"{"。
由于我使用的是 text/json,所以我如何告诉 HttpClient 发送带有开头引号和结尾引号的 json 字符串,而不是去掉它?
或者我在这里对 JsonConvert.SerializeObject() 做错了什么?
【问题讨论】:
-
客户端还是服务器端? JSON 字符串两端的双引号,当我通过 freeformatter.com/json-validator.html 运行它时,它表示它是有效的 JSON 字符串。因此,当发送到服务器端(AspNetCore MVC)时,它应该在客户端(HttpClient)上工作。如果 text/json 两端没有双引号,AspNetCore MVC 将不会接受它
-
回答您关于 Fiddler 示例的问题。如果两端没有双引号,则会导致 AspNetCore MVC 异常,其中 Newtonsoft.Json.JsonInputFormatter & Newtonsoft.Json.JsonReaderException 遇到错误。但是在两端加上双引号就可以了。
-
我的立场是正确的 - 从技术上讲,JSON string 本身就是有效的 JSON。尽管如此,要求客户端对 JSON 进行刺痛,而不是直接发送它是非常尴尬的。我会尝试回答。
-
另一个观察结果 - 在 GET 请求中发送 JSON 正文(或任何正文)并不常见。
color: green是列表过滤器还是类似的东西?将其作为查询字符串参数传递更为常见。 -
我的手被绑了。必须遵守陷入自身集成混乱的第 3 方提供商。不过它的很多客户都在使用它。
标签: .net-core httpclient dotnet-httpclient