C# 将有效JSON发布到.NET Core 2/.NET MVC Api时收到500个错误。(post请求为空,声明“System.Net.Http.NowriteNoSekStreamContent”)

C# 将有效JSON发布到.NET Core 2/.NET MVC Api时收到500个错误。(post请求为空,声明“System.Net.Http.NowriteNoSekStreamContent”),c#,json,asp.net-mvc,web-api-testing,C#,Json,Asp.net Mvc,Web Api Testing,因此,请快速了解我的解决方案中当前发生的情况。我正在用c#编写相当基本的API web测试,使用XUnit框架和我创建的一些json验证帮助程序来验证从API收到的响应消息和有效负载。我一直在绞尽脑汁想弄明白为什么我的PostAsync()调用在到达API后会传递null,因为在调试我的ApiTests解决方案时,我可以看到请求体是一个有效的json请求。下面是我目前正在调试的测试的一些片段 OrderControllerTests.cs [Theory] [MemberData(nam

因此,请快速了解我的解决方案中当前发生的情况。我正在用c#编写相当基本的API web测试,使用XUnit框架和我创建的一些json验证帮助程序来验证从API收到的响应消息和有效负载。我一直在绞尽脑汁想弄明白为什么我的PostAsync()调用在到达API后会传递null,因为在调试我的ApiTests解决方案时,我可以看到请求体是一个有效的json请求。下面是我目前正在调试的测试的一些片段

OrderControllerTests.cs

[Theory]
    [MemberData(nameof(OrderControllerData.postCancelOrder), MemberType = typeof(OrderControllerData))]
    public async Task PostValidCancelOrder(string jsonBody, string expectedResponseBody)
    {
        var postObject = "api/Order/cancel";
        var request = new StringContent(jsonBody, Encoding.UTF8, "application/json");
        var response = await _httpClient.PostAsync(postObject, request);
        var content = await response.Content.ReadAsStringAsync();

        ValidationHelper.ValidateNoErrors(response);
        ValidationHelper.ValidateJson(content, expectedResponseBody);
    }
[HttpPost("cancel")]
    public async Task<IActionResult> Cancel([FromBody]CancelOrderViewModel model)
    {
        var command = new CancelOrderCommand(model.OrderId, model.Test1Fee, model.Test2Fee);
        var order = await _mediator.Send(command);

        return Ok(order);
    }
在这次测试中发生了一些事情。所有这些似乎都很好地发挥了作用,并达到了预期效果(除了下面的第3条)

  • 使用postObject创建我的requestUri
  • 创建我的HttpContent。XUnit通过MemberData属性传递我的jsonBody参数。它查看PostCancellorder公共静态IEnumerable的数据层类
  • 将请求发布到API
  • 读取以字符串格式返回的有效负载
  • 验证帮助程序检查HTTP响应消息。ValidateNoErrors方法只是寻找一个200响应代码。第二个问题对这个问题不重要,因为我的测试在第一个ValidationHelper时失败了
  • 现在这就是我目前发布到api的内容

    "{\"orderId\": \"c701b60a-4fb1-4f79-9e17-0172a9a17bbc\",\"test1Fee\":\"5}\",\"test2Fee\":\"10\"}"
    
    这是Api/OrderController中的HttpPost

    OrderController.cs

    [Theory]
        [MemberData(nameof(OrderControllerData.postCancelOrder), MemberType = typeof(OrderControllerData))]
        public async Task PostValidCancelOrder(string jsonBody, string expectedResponseBody)
        {
            var postObject = "api/Order/cancel";
            var request = new StringContent(jsonBody, Encoding.UTF8, "application/json");
            var response = await _httpClient.PostAsync(postObject, request);
            var content = await response.Content.ReadAsStringAsync();
    
            ValidationHelper.ValidateNoErrors(response);
            ValidationHelper.ValidateJson(content, expectedResponseBody);
        }
    
    [HttpPost("cancel")]
        public async Task<IActionResult> Cancel([FromBody]CancelOrderViewModel model)
        {
            var command = new CancelOrderCommand(model.OrderId, model.Test1Fee, model.Test2Fee);
            var order = await _mediator.Send(command);
    
            return Ok(order);
        }
    
    该消息还指示对象引用未设置为对象的实例,因为所有内容显然都为null

    因此,问题在于如何在XUnit测试中构造请求。但是我很困惑,因为我相信我正确地序列化了json。即使Api使用swagger在我的浏览器中本地运行,所示的示例也是

    {
      "orderId": "string",
      "test1Fee": 0,
      "test2Fee": 0
    }
    
    在我的post对象中创建的转义是否就是问题所在?如果是,我该如何着手解决这个问题?我尝试使用PostAsJsonAsync()而不仅仅是postassync(),但它仍然产生相同的结果


    我做错了什么?我相信这很简单,我只是错过了。如果我需要提供更多信息,请告诉我。任何帮助都将不胜感激。谢谢。

    您正在测试的JSON和来自Swagger的JSON之间的一个区别是,您引用的是数字,其中一个是5}。不确定这是否会使整个输入对象变成空。@shambulator是的,你完全正确。我把它们作为字符串传递,而不是int。这确实成功地发布了它。谢谢你,伙计。我以前就应该看到这一点。不用担心,有时候只需要一双新鲜的眼睛:)