【问题标题】:How to use IActionResult in .NET Framework 4.6.1?如何在 .NET Framework 4.6.1 中使用 IActionResult?
【发布时间】:2018-07-31 11:33:54
【问题描述】:

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

我的问题是,我似乎无法在我的解决方案中的一个项目中使用 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

    }

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

任何帮助都将不胜感激,尤其是如果有人知道如何完成这项工作。

谢谢

【问题讨论】:

  • 我在他们的文档中寻找任何显示 IActionResult 被使用的示例,到目前为止我只找到了这个docs.microsoft.com/en-us/azure/azure-functions/… 我相信还有更多。
  • 当你说你不能使用IActionResult时,你是什么意思。您收到错误消息吗?如果是这样,那是什么消息。可能是您缺少引用或命名空间。
  • 既然可以使用 .NET Core 创建 Azure Functions,为什么还要关心 4.6.1?
  • @Nkosi 它说“找不到类型或命名空间'IActionResult'.....”我已经下载了与我的 .NET 标准 2.0 项目中完全相同的包并复制了相同的代码。
  • @PanagiotisKanavos 在别人的解决方案中工作,我不知道为什么他们有这个项目的 4.6.1。

标签: c# asp.net .net azure


【解决方案1】:

短版

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

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

说明

ASP.NET Core 是 ASP.NET 5 的“新”名称。它是一个新的框架,它合并了 MVC 和 Web API 堆栈,并且可以在旧的完整框架和当时称为 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 接口。使用接口意味着测试和模拟结果会更容易很多。这也意味着实现它的类不必处理可能不需要的属性和基方法。

在 Web 框架 ASP.NET Core 中,整个堆栈都经过重新设计,现在有一个堆栈和一个用于结果的基本接口,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,这些类和 API 应由符合该标准版本的运行时提供。当创建 .NET Standard 2.0 库时,这意味着代码可以使用 2.0 版本中定义的任何类和 API。

只添加界面

IActionResult 不是 .NET Standard 2.0 的一部分。它由包Microsoft.AspNetCore.Mvc.Abstractions 提供。

【讨论】:

  • 非常感谢。知道什么是什么确实很令人困惑。
【解决方案2】:

解决方案。

我需要安装 Microsoft.AspNetCore.Mvc 包才能让它工作。 为我的新手问题感到抱歉,非常感谢您的帮助。

编辑:正如@PanagiotisKanavos 使用 IActionResult 的 Microsoft.AspNetCoreMvc.Abstractions 包编写的那样。除此之外还需要一些其他的东西,所以去了整个包裹。

【讨论】:

  • 不包括在内,AspNetCore.Mvc 包整个 ASP.NET Core 库。它可以在 Core 和 Full 框架上运行。如果你只想要接口,你只需要Microsoft.AspNetCore.Mvc.Abstractions
【解决方案3】:

它甚至存在于 .net 中吗?它似乎只存在于 .net core 中。

来自微软:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.iactionresult?view=aspnetcore-2.1

请参阅该页面上的“适用于”。

【讨论】:

  • 那么.NET Framework 4.6.1 是.net 而.NET Standard 2.0 是.net core?是否有任何 Nuget 包我可以用来解决这个问题,还是我必须使用 IHttpActionResult?我有一些代码,我只想从使用 IActionResult 的其他 .NET Standard 2.0 项目中复制。
  • @PanagiotisKanavos 你是对的,但是:a) 我的意思是,这是我能找到的唯一一个。 b) 这些天来,文档在一起的。参见例如here
  • @jagge123 不,他们不是。 .NET Standard 2.0 是 API 的定义。完整框架和核心框架都直接支持它,或者通过添加一些包来支持它。虽然 IActionResult 是在 Core 中添加的,但 ActionResult 是在 ASP.NET MVC 中使用的 不同 基类,它没有实现 IActionResult
  • @jagge123 也许是“Microsoft.AspNet.WebApi.Core”?但看起来 Panagiotis Kanavos 可能知道这是否可能。
  • @PanagiotisKanavos 也许您可以回答 OP 关于 Nuget 包的问题。我想你比我知道的更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多