如何在.NET Framework 4.6.1中使用IActionResult?

jag*_*123 8 .net c# asp.net azure

在过去的几个小时里,我一直在寻找答案,没有任何成功.我对编程比较陌生,所以请放轻松我:-)

我的问题是,我的解决方案中的一个项目似乎无法使用IActionResult,该解决方案的目标是.NET Framework 4.6.1,但在针对.NET Standard 2.0的相同解决方案(不同项目)中我可以使用它.

我试图安装完全相同的Nuget包,除了目标框架外,一切看起来完全一样.

我只想使用IActionResults编写Azure Functions,如:

 public static async Task<IActionResult> MyFuntcion([HttpTrigger(AuthorizationLevel.Function, "get", Route = null")]HttpRequest req, TraceWriter log)
    {

      //Do some stuff then redirect

    }
Run Code Online (Sandbox Code Playgroud)

我猜我的目标框架是什么导致我无法使用IActionResult,但我不明白为什么.

任何帮助都将非常感激,特别是如果有人知道如何使这项工作.

谢谢

Pan*_*vos 5

简洁版本

您不能在Full Framework MVC或Web API中将IActionResult用作结果对象。您必须首先将其映射到适当的类型。您可能应该在类库中使用IActionResult,让核心项目处理返回类型

但是 ASP.NET Core不需要.NET Core运行时,它也可以针对完整框架。也许您可以针对主要项目使用针对完整框架的ASP.NET Core项目?

说明

ASP.NET Core是ASP.NET 5的“新”名称。它是一个合并了MVC和Web API堆栈的新框架,旨在在较旧的Full框架和后来的DNXCore上运行。这两个名称都更改为ASP.NET Core 1.0和Core .NET 1.0,这导致了我们今天的困惑。

在ASP.NET Core,ASP.NET MVC和Web API是两个不同的堆栈之前,它们使用了不同的控制器基类并返回了不同的结果。ASP.NET MVC使用抽象的ActionResult类,而Web API使用IHttpActionResult接口。使用界面意味着测试和模拟结果容易得多。这也意味着实现它的类不必处理可能不需要的属性和基本方法。

ASP.NET Core(Web框架)中,整个堆栈都经过了重新设计,现在只有一个堆栈,带有用于结果的单个基本接口IActionResult。Core的ActionResult是默认实现,但是任何人都可以创建其他实现。例如,RedirectResult不需要Content属性,因此它没有一个。

只要添加了适当的程序包,每个.NET Standard 2.0库都可以使用此接口。

但是,这并不意味着它可以用作ASP.NET MVC 6或Web API 2项目中的实际返回类型,因为MVC的ActionResult或Web API的IHttpActionResult都无法实现它。必须编写代码以从具体的IActionResult实例映射到具体的MVC ActionResult或Web API IHttpActionResult实例。

但是,如果您的主要项目是ASP.NET Core,则无论它在Full框架还是Core框架上运行,都可以使用该接口。

.NET标准

.NET Standard是一组API规范,而不是特定的运行时。每个版本都指定了一组由符合该标准版本的运行时提供的类和API。创建.NET Standard 2.0库时,这意味着代码可以使用2.0版本中定义的任何类和API。

仅添加界面

IActionResult 属于.NET Standard 2.0。由包Microsoft.AspNetCore.Mvc.Abstractions提供