获取 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&lt;ActionResult&lt;JsonResult&gt;&gt;改成Task&lt;JsonResult&gt; @Kahbazi 是的,问题是我有时需要返回 StatusCodeResult。我可以通过返回 Task&lt;ActionResult&gt; 来解决问题,但这对我的前端消费者来说是一个重大变化。 是的,返回Task&lt;ActionResult&gt; 是正确的做法。我看不出更改 thi 会如何破坏客户 @Kahbazi 我可以再次解决它,但如果唯一的变化是返回类型,那么我将失去一层 Json,这是前端所没有的。大多数情况下,我只是对为什么 2.1 中的这个工作代码在 2.2 中不起作用感到困惑。感谢您的帮助! 您仍在返回JsonResult。你的前端仍然得到 json 【参考方案1】:

JsonResult 已经实现了IActionResult 并继承自ActionResult,正如您在docs 中看到的那样。所以你应该返回Task&lt;IActionResult&gt;,以防你也想返回其他类型的结果。

但是,我建议您不要尝试捕获一般异常,因为这些异常都会由系统处理,并且会返回状态码 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对象类型

尝试实现登录时出现 ArgumentException(ASP.NET Core 项目)

ArgumentException:字典中已存在具有相同键的元素