postman 本地rest API控制器未从存储库function-call接收数据

pzfprimi  于 2022-12-26  发布在  Postman
关注(0)|答案(1)|浏览(177)

我们的VS-2022开发项目是Blazor WASM Core-6,使用本地REST-API处理数据。使用Postman,我的测试并没有像人们所期望的那样,通过控制器调用存储库函数来获取数据--使用断点和本地调试。
存储库函数返回语句为return Ok(vehicleTrips);。IEnumerable vehicleTrips数据变量包含DB提取所需的正确四条记录。
从控制器调用存储库函数为:

var result = (await motripRepository.GetMOTripsByDateRange((int)eModelType.Vehicle, pVehicleList, pDateFrom, pDateTo)!)!;

控制器函数签名为:

[HttpGet("byDateRange/{pVehicleList}/{pDateFrom}/{pDateTo}")]
  [ActionName(nameof(GetVehicleMOTripsByDateRange))]
  public async Task<ActionResult<IEnumerable<MOTRIP>>> GetVehicleMOTripsByDateRange([FromRoute] string pVehicleList, [FromRoute] string pDateFrom, [FromRoute] string pDateTo) {

**这是我的问题。**来自存储库的result返回值有一个为空的return.Value--不是我们应该的四个trip记录。

此外,VS-Studio的“local”调试器显示return还有其他属性,如.Return.Return.Value.Count为4。

**我的问题是“是什么导致了这种情况”?**我使用Postman的所有其他rest-api调用和控制器调用都能正常工作。
**我是否从Visual-Studio中选择了错误的“控制器”类型?**我对编写经典的MVC Web应用程序毫无经验。VS-Blazor提供了许多控制器类型。过去,我“复制”了一个正常工作的控制器,并为不同的“模型””更改了代码”。

您的帮助是受欢迎的,并表示赞赏.谢谢...约翰

f87krz0w

f87krz0w1#

我发现了导致这个结果的真正原因,值为空,与控制器类型无关--它是在解释来自存储库函数的返回值时出现的。
我发现了一个SO链接Get a Value from ActionResult in a ASP.Net Core API Method,它解释了如何响应reply/answer部分中的ActionResult<objecttype>返回值,其中单词“actual”是第一个定义的,您将在下面修改的代码中看到这个单词“actual”。
我修改过的代码贴在这里,代码部分内部和代码部分下方都有注解。代码内部的注解以“〈==”开头,后面是文本,直到“==〉”

// Initialize.
MOTRIP emptyMoTrip = new MOTRIP();
MOTRIP? resultMoTrip = new MOTRIP();
IEnumerable<MOTRIP> allTrips = Enumerable.Empty<MOTRIP>();
int daysPrevious = (int)(pTripType == eTripType.Any ? eDateRangeOffset.Week : eDateRangeOffset.Month);

// convert DateRangeOffset to 'dateonly' values.
DateOnly dtTo = DateOnly.FromDateTime( DateTime.Today);
DateOnly dtFrom = dtTo.AddDays(daysPrevious);

// Fetch the vehicle trips by date-range.
var result = await GetVehicleMOTripsByDateRange(UID_Vehicle.ToString(), dtFrom.ToString(), dtTo.ToString());
if ((result.Result as OkObjectResult) is null) { **<== this is the fix from the SO link.==>**
    return StatusCode(204, emptyMoTrip);  
}

var statusCode = (result.Result as OkObjectResult)!.StatusCode;
if (statusCode==204) {
    return StatusCode(204, emptyMoTrip);
}

**<== this next section allows code to get the result's DATA for further processing.==>**
var actual = (result.Result as OkObjectResult)!.Value as IEnumerable<MOTRIP>;
allTrips = (IEnumerable<MOTRIP>)actual!;

if ((allTrips is not null) && (!allTrips.Any())) {
    return StatusCode(204, emptyMoTrip);
}
<== this next section continues with business-logic related to the result-DATA.==>
if (allTrips is not null && allTrips.Any()) {
    switch (blah-blah-blah) {   
**<== the remainder of business logic is not shown as irrelevant to the "fix".==>**

请使用浏览器搜索“〈==”来查找我的代码注解。请使用浏览器搜索“actual”和“OkObjectResult”来查看相关的代码修复语句。

相关问题