[英]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.