接收500错误,将有效的JSON发布到.NET Core 2 / .NET MVC Api。 (post请求为null并声明“System.Net.Http.NoWriteNoSeekStreamContent”)

时间:2018-01-22 21:25:25

标签: c# json asp.net-mvc web-api-testing

快速了解我的解决方案目前正在进行的工作。我正在使用XUnit框架和我创建的一些json验证助手在c#中编写非常基本的API Web测试,以验证从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);
    }

此测试中发生了一些事情。所有这些似乎都正常工作(按照下面的#3除外)。

  1. 使用postObject创建我的requestUri。
  2. 创建我的HttpContent。 XUnit通过MemberData属性传递我的jsonBody param。其中查看了postCancelOrder public static IEnumerable的数据层类。
  3. 将请求发布到API。
  4. 读取以字符串格式返回的有效负载。
  5. Validation Helper检查HTTP响应消息。 ValidateNoErrors方法只是寻找200响应代码。第二个问题与这个问题无关,因为我的测试在第一个ValidationHelper上爆炸。
  6. 现在这是我发布到api的内容。

    "{\"orderId\": \"c701b60a-4fb1-4f79-9e17-0172a9a17bbc\",\"test1Fee\":\"5}\",\"test2Fee\":\"10\"}"
    

    这是Api / OrderController中的HttpPost。

    OrderController.cs

    [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);
        }
    

    本质上,这个HttpPost传递一些参数,然后运行多个方法并检查这些对象,以确定订单是否有资格被取消。在帖子中发生的事情现在无关紧要。在调试我的测试并且它到达api的HttpPost方法的入口点时,'command'和'model'都是null。当然,Api会拒绝请求,并以500错误响应。

    {StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.NoWriteNoSeekStreamContent, Headers:{  Date: Mon, 22 Jan 2018 19:38:55 GMT  Transfer-Encoding: chunked  Server: Kestrel  Request-Context: appId=cid-v1:93254013-d606-465f-8cee-12e422316f31  X-SourceFiles: =?UTF-8?B?RDpcUUFccWFWZW5kb3JcQWJzdHJhY3Rvck9tc0FwaVxzb3VyY2VcQXBpXGFwaVxPcmRlclxjYW5jZWw=?=  X-Powered-By: ASP.NET  Content-Type: application/json; charset=utf-8}}
    

    此消息指示Object引用未设置为对象的实例,因为显然所有内容都为null。

    所以问题必须与我在XUnit测试中构建请求的方式有关。但我很困惑,因为我相信我正确地序列化了json。即使Api在我的浏览器中使用swagger本地运行,指示的示例也是

    {
      "orderId": "string",
      "test1Fee": 0,
      "test2Fee": 0
    }
    

    我的帖子对象中创建的转义是否可以成为问题?如果是这样,我该如何解决这个问题呢?我尝试使用PostAsJsonAsync()而不仅仅是PostAsync(),但它继续产生相同的结果。

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

0 个答案:

没有答案