【问题标题】:MVC5 / WEBAPI 2 routing HomeApiController to /api/home rather than /homeapiMVC5 / WEB API 2 路由 Home ApiController 到 /api/home 而不是 /home api
【发布时间】:2017-07-10 20:23:17
【问题描述】:

我有一个需要添加基本前端的现有 webapi 2 应用程序。现有的 webapi 控制器已在名为 xController yController 的 Controllers 目录根目录中创建。

Controllers
-XController.cs
-YController.cs

以下路线

 config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}"
            );

这些控制器中的每一个都需要一个随附的 MVC 控制器。我想做的是将 API 控制器重命名为 XApiController YApiController 并使用路由来确保服务的现有用法完成中断。然后我可以为前端添加标准的 MVC 控制器。

Controllers
-XApiController (previously XContoller)
-XController
-YApiController (previously YController)
-YController

【问题讨论】:

  • 为什么需要带有 MVC 控制器的 Web API 应用程序? Web API 用于服务,MVC 应用应该使用这些服务。
  • 当我使用 ElasticBeanstalk 进行部署时,我只能拥有 1 个应用程序。我认为不需要将其拆分并创建 2 个部署管道和重复基础架构的成本。

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


【解决方案1】:

您不能只使用RoutePrefix 属性来执行此操作吗?然后你可以随心所欲地调用你的控制器,并让属性决定它应该托管在哪里,在控制器级别控制你的路由有利有弊,但它似乎是一个常见的用例,例如:

[RoutePrefix("api/home")]
public class SomeHomeController: ApiController
{
 // ...
}

【讨论】:

  • 我必须为每个操作添加 Route 属性,但这完成了工作,谢谢。
【解决方案2】:

控制器在每个框架中都是独立的类型,每个框架都可以发现它们,而不管它们的位置如何(前提是它们具有正确的名称)。没有理由弄乱路由以获得您想要的结果。您唯一需要的(假设可以接受)是将控制器放入不同的命名空间/文件夹,这样您就可以拥有 2 个同名的控制器(MVC 和 Web API)。

ApiControllers
-XController
-YController
Controllers
-XController
-YController

如果您问我,最好将 MVC 和 API 控制器放在单独的位置,即使您不能将它们部署为单独的应用程序。

【讨论】:

  • 感谢您的意见,我以前采用过这种方法,但不是 100% 被说服,好奇让我想知道我是否可以通过路由来做到这一点。我仍然不确定我要采用哪种方式,但 Grofits 的回答更符合我的要求,得到了支持。
  • 作为记录,这也应该与基于约定的路由(在一个地方)有关,因此您不必通过 IHttpRoute 或通过子类化向每个控制器添加属性HttpRoute。您只需更改传入 URL 上的控制器路由值以添加“Api”部分,并在生成传出 URL AFAIK 之前从路由值中删除“Api”。
猜你喜欢
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 2019-06-30
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多