HttpClient.SendAsync()不将JSON作为字符串发送

时间:2017-09-29 18:29:47

标签: .net-core httpclient dotnet-httpclient

我无法弄清楚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()做错了什么?

1 个答案:

答案 0 :(得分:3)

直接回答这个问题......

您没有逃避 JSON字符串中的引号。试试这个:

var jsonRequest = string.Format("\"{0}\"", jsonData.Replace("\"", "\\\""));

<强>然而...

我怀疑你是如何解决这个问题的。您在评论中提到,如果您不在客户端对字符串进行字符串化,则会在服务器端(在您的MVC代码中)出现错误。但是,要求客户端执行此操作非常尴尬和非标准。我会:

  1. 将内容类型从text/json更改为application/json。这不会解决问题,但它是标准。

  2. 删除上面的行并直接发送jsonData。即不要将JSON字符串化。

  3. 提出一个新问题,了解如何解决您获得的服务器端错误,并发布相关的MVC代码。