最近两个小时,我一直在寻找答案,但没有成功。我是编程的新手,所以请放手:-)
我的问题是,似乎我无法在针对.NET Framework 4.6.1的解决方案中的一个项目中使用IActionResult,但在针对.NET Standard 2.0的同一解决方案(不同项目)中,我可以使用它。
我尝试安装完全相同的Nuget软件包,除了目标框架之外,其他所有内容看起来都完全相同。
我只想使用IActionResults编写Azure函数,例如:
public static async Task<IActionResult> MyFuntcion([HttpTrigger(AuthorizationLevel.Function, "get", Route = null")]HttpRequest req, TraceWriter log)
{
//Do some stuff then redirect
}
我猜我的目标框架是导致我无法使用IActionResult的原因,但是我不明白为什么。
任何帮助将不胜感激,尤其是如果有人可能知道如何进行这项工作。
谢谢
答案 0 :(得分:4)
简短版本
您不能在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接口。使用接口意味着除其他外,它更容易测试和模拟结果。这也意味着实现它的类不必处理可能不需要的属性和基本方法。
在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。创建.NET Standard 2.0库时,这意味着代码可以使用2.0版本中定义的任何类和API。
仅添加界面
IActionResult不属于.NET Standard 2.0的一部分。它由软件包Microsoft.AspNetCore.Mvc.Abstractions提供。
答案 1 :(得分:2)
解决方案。
我需要安装Microsoft.AspNetCore.Mvc软件包才能使其正常运行。 抱歉我的新手问题,非常感谢您的帮助。
编辑:@PanagiotisKanavos使用IActionResult的Microsoft.AspNetCoreMvc.Abstractions包编写了足够的内容。除此之外,还需要其他一些东西,所以整个包装都用了。
答案 2 :(得分:0)
它甚至存在于.net中吗?它似乎仅存在于.net内核中。
Microsoft上的来源:
请参阅该页面上的“适用于”。