为什么返回“ActionResult<IEnumerable<ZapResult>>”的 ASP.NET Core 操作可以返回任何对象的“BadRequest()”?

Shu*_*eng 5 c# asp.net asp.net-core

我想知道为什么返回 an 的 ASP.NET Core 操作ActionResult<IEnumerable<ZapResult>>可能会返回 a BadRequest(scan)scan自定义用户定义类的对象在哪里?

在这种情况下,我看不到任何转换ZapScanIEnumerable<ZapResult>​​ .

事实上,Ok()和 都返回从(not )BadRequest()派生的对象,但无论哪种情况,一切都正常并且 JSON 返回给客户端:ActionResultActionResult<T>

[HttpGet, FormatFilter]
public ActionResult<IEnumerable<ZapResult>> OnGet([FromQuery] ZapScan scan)
{
    return HandleRequest(scan);
}

private ActionResult<IEnumerable<ZapResult>> HandleRequest(ZapScan scan)
{
    if (ValidateScan(scan)) {
        IEnumerable<ZapResult> zapResults = _zapDispatcher.Dispatch(scan);
        return Ok(zapResults);
    }
    else
    {
        var clientIp = HttpContext.Request.HttpContext.Connection.RemoteIpAddress;
        var requestUrl = UriHelper.GetDisplayUrl(HttpContext.Request);
        _logger.LogError("{0}: Invalid request: [{1}] {2} ({3})", MethodBase.GetCurrentMethod().Name, clientIp, requestUrl, scan);
        return BadRequest(scan);
    }
} 
Run Code Online (Sandbox Code Playgroud)

对我来说,似乎任何东西都可以转换为ActionResult<T>,并且这种返回类型是完全通用的?

Ian*_*emp 1

BadRequestResult(返回者BadRequest())源自ActionResult
ActionResult<T>可以隐式转换为ActionResult(通过IConvertToActionResult它实现的接口)。

因此,返回类型是兼容的,这就是它们可以互换使用的原因。

BadRequestResult有一个构造函数,它接受任何object并将其序列化为按原样输出到客户端的字符串。