2

我有一个现有的webapi 2应用程序,需要添加一个基本的前端。现有的webapi控制器已在名为xController yController的Controllers目录根目录中创建。MVC5/WEBAPI 2将HomeApiController路由到/ api/home而不是/ homeapi

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 
+0

为什么你需要MVC控制器的Web API应用程序? Web API用于服务,MVC应用程序应使用这些服务。 –

+0

由于我使用ElasticBeanstalk进行部署,因此我只能有1个应用程序。我认为它不需要分裂它的麻烦,并创建2个部署管道和重复基础设施的成本。 –

回答

2

你不能只使用RoutePrefix属性来做到这一点吗?那么你可以随心所欲地调用你的控制器,只要属性决定它应该在哪里被托管,在控制器级别控制你的路由有优点和缺点,但它似乎是一个常见的用例,例如:

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

我不得不为每个动作添加Route属性,但是这表示感谢。 –

2

控制器是每个框架中的独立类型,每个框架都可以发现它们,而不管它们的位置(只要它们的名称正确)。没有理由混乱路由来获得你想要的结果。你需要的唯一东西(假设它是可以接受的)是把你的控制器放到一个不同的命名空间/文件夹中,这样你就可以拥有2个同名的控制器(MVC和Web API)。

ApiControllers 
-XController 
-YController 
Controllers 
-XController 
-YController 

如果你问我,它仍然是更好地保持了MVC和API控制器在一个单独的位置,即使你无法将它们作为单独的应用部署。

+0

感谢您的输入,我以前采取了这种方法,但没有100%相信,好奇心让我想知道如果我可以做路由。我现在还没有决定要怎么做,但Grofits的回答更重要的是我正在寻找的东西,upvoted。 –

+0

为了记录,这也应该可以用基于约定的路由(在一个地方)来做,所以你不必通过'IHttpRoute'或通过子类化'HttpRoute'来为每个控制器添加属性。您只需更改传入URL上的控制器路由值以添加“Api”部分,并在生成传出URL AFAIK之前从路由值中除去“Api”。 – NightOwl888

相关问题