简体   繁体   English

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

[英]Why can an ASP.NET Core action returning an ` ActionResult<IEnumerable<ZapResult>>` return a `BadRequest()` of any object?

I wonder why an ASP.NET Core action returning an ActionResult<IEnumerable<ZapResult>> may return a BadRequest(scan) , where scan is an object of a custom user-defined class?我想知道为什么返回ActionResult<IEnumerable<ZapResult>>的 ASP.NET Core 操作可能会返回BadRequest(scan) ,其中scan是自定义用户定义类的对象?

In this case, I don't see any sensible way of converting ZapScan to IEnumerable<ZapResult> .在这种情况下,我没有看到任何将ZapScan转换为IEnumerable<ZapResult>明智方法。

Indeed, both Ok() and BadRequest() return objects derived from ActionResult (not ActionResult<T> ), but in either case everything works fine and JSON is returned to the client:事实上, Ok()BadRequest()返回从ActionResult派生的ActionResult (不是ActionResult<T> ),但在任何一种情况下,一切都正常,JSON 返回给客户端:

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

To me it seems like anything can be converted to ActionResult<T> , and that such return type is completely generic?对我来说似乎任何东西都可以转换为ActionResult<T> ,并且这种返回类型是完全通用的?

BadRequestResult (returned by BadRequest() ) derives from ActionResult . BadRequestResult (由BadRequest()返回)源自ActionResult
ActionResult<T> is implicitly convertible to ActionResult (via the IConvertToActionResult interface it implements). ActionResult<T>可隐式转换为ActionResult (通过它实现的IConvertToActionResult接口)。

Therefore the return types are compatible which is why they can be used interchangeably.因此返回类型是兼容的,这就是它们可以互换使用的原因。

BadRequestResult has a constructor that takes any object and serializes it to a string that is output as-is to the client. BadRequestResult有一个构造函数,它接受任何object并将其序列化为一个字符串,该字符串按原样输出到客户端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 ASP.net 核心 API 返回 ActionResult<t> 不强制返回类型</t> - ASP.net Core API returning ActionResult<T> not enforcing return type 不一致的行为:手动返回 BadRequest 时 ASP.NET Core 中的错误响应对象 - Inconsistent behaviour: Error response object in ASP.NET Core when manually return BadRequest ASP.NET Core如何将任何类型转换为ActionResult <T> 控制器动作的返回类型? - How is ASP.NET Core able to convert any type to ActionResult<T> return type of controller actions? Controller方法返回ActionResult的原因是什么? (ASP.NET Core Web API) - What's the reason why Controller methods return ActionResult? (ASP.NET Core Web API) ASP.NET Core 6 MVC - 返回 IEnumerable 以查看 - ASP.NET Core 6 MVC - returning IEnumerable to View 单元测试中的 ActionResult 问题无法在 POST 返回值上 Assert.Equal (asp.net core mvc web api) - Trouble with ActionResult in unit test can't Assert.Equal on POST return value (asp.net core mvc web api) asp.net mvc return actionresult for video - asp.net mvc return actionresult for video 在 ASP.NET Core 中将列表对象转换为 IEnumerable&lt;&gt; - Convert list object to IEnumerable<> in ASP.NET Core ASP.NET Core API如何在操作方法中将ActionResult <T>转换为T. - How ASP.NET Core APIs convert ActionResult<T> to T in action methods ASP.NET Core 5 - CreatedAtAction 在返回复杂对象时不返回任何数据 - ASP.NET Core 5 - CreatedAtAction not returning any data when returning complex object
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM