C# 将有效JSON发布到.NET Core 2/.NET MVC Api时收到500个错误。(post请求为空,声明“System.Net.Http.NowriteNoSekStreamContent”)
因此,请快速了解我的解决方案中当前发生的情况。我正在用c#编写相当基本的API web测试,使用XUnit框架和我创建的一些json验证帮助程序来验证从API收到的响应消息和有效负载。我一直在绞尽脑汁想弄明白为什么我的PostAsync()调用在到达API后会传递null,因为在调试我的ApiTests解决方案时,我可以看到请求体是一个有效的json请求。下面是我目前正在调试的测试的一些片段 OrderControllerTests.csC# 将有效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
[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条)
"{\"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。这确实成功地发布了它。谢谢你,伙计。我以前就应该看到这一点。不用担心,有时候只需要一双新鲜的眼睛:)