获取 ArgumentException:升级到 .NET Core 2.2 后使用 ActionResult<JsonResult>> 作为返回类型的类型参数无效
Posted
技术标签:
【中文标题】获取 ArgumentException:升级到 .NET Core 2.2 后使用 ActionResult<JsonResult>> 作为返回类型的类型参数无效【英文标题】:Getting ArgumentException: Invalid type parameter using ActionResult<JsonResult>> as a return type after upgrading to .NET Core 2.2 【发布时间】:2019-11-01 12:45:03 【问题描述】:我在尝试访问我构建的任何 API 端点时遇到以下运行时错误,如下所示:
ArgumentException: Invalid type parameter
'Microsoft.AspNetCore.Mvc.JsonResult' specified for 'ActionResult<T>'.
此代码在我的 .NET Core 2.1 应用程序中按预期运行。升级到 .NET Core 2.2 后,它就坏了。
这是控制器中我的一个端点的代码。
[HttpGet]
public async Task<ActionResult<JsonResult>> Get()
try
MongoConnector mongo = new
MongoConnector(_configService.GetMongoConnectionString());
List<BsonDocument> queues = await mongo.AggregateQueues(
(aggregator) => aggregator
.Match(CommonAggregation.SinceYesterday)
.Sort(CommonAggregation.SortByDate)
.Group(QueueAggregators.GroupQueuesByMessagingName)
);
List<QueueHealth> queueHealth = await MongoConnector.DeserializeList<QueueHealth>(queues);
JsonResult result = new JsonResult(queueHealth);
result.Value = queueHealth;
result.ContentType = "application/json";
result.StatusCode = 200;
return result;
catch (Exception ex)
logger.Error(ex, "An exception was thrown within /api/MessageQueue");
return new StatusCodeResult(InternalServerError);
有人知道 2.1 和 2.2 之间发生了什么变化会导致这种情况吗?我什至找不到其他人提到类似的问题或在线更改文档。
【问题讨论】:
你试过把Task<ActionResult<JsonResult>>
改成Task<JsonResult>
@Kahbazi 是的,问题是我有时需要返回 StatusCodeResult
。我可以通过返回 Task<ActionResult>
来解决问题,但这对我的前端消费者来说是一个重大变化。
是的,返回Task<ActionResult>
是正确的做法。我看不出更改 thi 会如何破坏客户
@Kahbazi 我可以再次解决它,但如果唯一的变化是返回类型,那么我将失去一层 Json,这是前端所没有的。大多数情况下,我只是对为什么 2.1 中的这个工作代码在 2.2 中不起作用感到困惑。感谢您的帮助!
您仍在返回JsonResult
。你的前端仍然得到 json
【参考方案1】:
JsonResult
已经实现了IActionResult
并继承自ActionResult
,正如您在docs 中看到的那样。所以你应该返回Task<IActionResult>
,以防你也想返回其他类型的结果。
但是,我建议您不要尝试捕获一般异常,因为这些异常都会由系统处理,并且会返回状态码 500。
【讨论】:
这个答案对我有帮助,谢谢。我还捕获了一般异常,以便在我们与第三方组件通信时记录它们。你有什么替代方案可以推荐吗? @AlejandroB。记录状态为 500(甚至更多)的响应是运行您的应用程序的基础架构的责任。例如,我们使用 AppInsights,如果出现 500,Azure 甚至会向我们发送一封电子邮件。这一切都应该在您的应用之外进行配置。以上是关于获取 ArgumentException:升级到 .NET Core 2.2 后使用 ActionResult<JsonResult>> 作为返回类型的类型参数无效的主要内容,如果未能解决你的问题,请参考以下文章
DotNet 5.0 IdnMapping.GetAscii 抛出 ArgumentException
ArgumentException:在字符 xx 处遇到“”,但应为:[]
HttpWebRequest:将 Cookie 添加到 CookieContainer -> ArgumentException(参数名称:cookie.Domain)
httpClient.GetAsync电话扔System.ArgumentException:无法确定JSON对象类型