【问题标题】:Can I add WebApi to an ASP.NET 5 (vnext) project without MVC6?我可以在没有 MVC 6 的情况下将 Web Api 添加到 ASP.NET 5 (vnext) 项目吗?
【发布时间】:2015-09-15 22:37:04
【问题描述】:

我有一个普通的 html/javascript 网站,我准备添加一些 WebApi 的东西。在 asp.net 4 中,我只需从 NuGet 添加 WebApi,然后我就可以开始添加从 ApiController 继承的 ApiControllers(在全局文件中进行一些设置之后)。

我在一个 ASP.NET 5 (vnext) 项目中尝试过,但没有成功。在我的课堂上添加using System.Web.Http; 时确实消除了ApiController 下的波浪线:

[Route("api/contact/requestACall")]
public class ContactController : ApiController
{
}

...我在尝试编译时仍然遇到错误。

Error CS0246 The type or namespace name 'Route' could not be found (are you missing a using directive or an assembly reference?) [my namespace].DNX Core 5.0 [my project path]\Controllers\ContactController.cs 5

Error CS0246 The type or namespace name 'ApiController' could not be found (are you missing a using directive or an assembly reference?) [my namespace].DNX Core 5.0 [my project path]\Controllers\ContactController.cs 6

我已经用谷歌搜索了几个小时,我能找到的每一个演练都是添加 MVC6 以添加 api 控制器。但是,我不需要此站点中的任何 MVC 功能,因为我使用 angular 并在客户端上完成所有这些操作。

如何在不随身携带所有 MVC 包袱的情况下使用 WebApi?我知道 ASP.NET 5 的全部意义在于确保您永远不必包含您不会使用的东西,所以我确信我遗漏了一些东西。

【问题讨论】:

  • 这不是你习惯的 MVC “包袱”。在 vNext/ASP.NET 5 中,这两个框架都被整合到一个单一的、流线型的 API 中,它充分利用了两者的优点。在过去,离开 MVC 可能是值得的,但这是一个大胆的新世界,它需要一种新的思维方式。旧规则不再适用:)
  • 你是说WebApi不能单独使用?你能肯定地说这个吗?我想知道为什么还要有单独的包。
  • github.com/aspnet/Mvc 源文档清楚地描述了这个特定的分支:模型视图控制器框架,用于构建具有清晰关注点分离的动态网站,包括合并的 MVC、Web API 和网页 w /剃刀。我对此的解释是,是的,它们是完全合并的,不能也不应该在 vNext 下分开。

标签: c# asp.net asp.net-web-api


【解决方案1】:

简短的回答是你不能。 vNext 中结合了多个框架。

ASP.NET MVC 源的文档清楚地描述了这个特定的分支:模型视图控制器框架,用于构建具有清晰的关注点分离的动态网站,包括合并的 MVC、Web API 和带有 Razor 的网页。我对此的解释是,是的,它们是完全合并的,在vNext下不能也不应该分开。

另外,如果你查看vNext中ApiControllersource,你会发现包含了以下引用:

using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.ActionResults;
using Microsoft.AspNet.Mvc.Actions;
using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.ModelBinding.Validation;
using Microsoft.AspNet.Mvc.WebApiCompatShim;

这使得在没有 ASP.NET 5 中的核心 MVC 依赖项的情况下无法使用 ApiController

根据 cmets,如果您查看此 tutorial,您会发现“WebAPI”控制器(主要负责返回 api 数据而不是 web 内容的控制器)继承自 Controller

using Microsoft.AspNet.Mvc;
...
Route("api/[controller]")]
public class TodoController : Controller

总而言之,在 vNext 中,无论交付的内容类型如何,您都应该使用一个控制器 Controller,并且应该来自Microsoft.AspNet.Mvc

System.Web.Http 已被弃用,Microsoft.AspNet.WebAPI 在 vNext 中无论如何都不会使用。

【讨论】:

  • 如果webapi依赖mvc,那么为什么webapi包不依赖mvc包呢?此外,您链接的源不是我尝试使用的类。我尝试使用 System.Web.Http.ApiController。看起来它是一个抽象类,这是我的问题,但可能仍然有一些 Web api 控制器继承自它。
  • 另外,我刚刚发现了这一点。如果您创建一个新的 vNext mvc 项目,它将包括 Microsoft.AspNet.Mvc,但不包括 Microsoft.AspNet.WebApi!那么 Microsoft.AspNet.WebApi 是不是严格意义上的遗留包?
  • @Chris 为了消除一些混乱,您不应该在 vNext 中使用 System.Web.Http.ApiController。那遗留代码。我相信Microsoft.AspNet.WebApi 不一定是遗留包,但它与 vNext 不兼容(但如果您继续在 5 之外构建站点,它将与 4.6 一起使用),尽管我不是 100% 确定那。但是,是的,vNext 控制器的 core 依赖项位于 Microsoft.AspNet.Mvc 中,这是您应该重点使用的唯一包。
  • 看来你是对的,我会在我更确定时将此答案标记为正确。看起来很奇怪,他们会努力分离关注点,然后将 mvc 与 web api 捆绑在一起作为实现这一目标的手段,你知道吗?在这一点上,也许我只是在寻求“是的,这看起来确实有点奇怪”,但您无需将其提供给我即可获得可接受的答案。我保证我会给它任何一种方式=)
  • 好吧,如果您将整个生态系统视为一个整体,他们会改进许多接触点,以便您可以在需要时获取所需的内容。然而,对于 MVC 和 WebAPI,他们注意到有很多相似之处和一些非常令人沮丧的差异,这就是为什么他们将其扁平化为一个单一的、有目的的 API。 David Fowler 几个月前发表了一篇很好的博文,有助于解释他们的一些决定:davidfowl.com/asp-net-vnext-architecture
猜你喜欢
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2014-09-05
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
相关资源
最近更新 更多