【问题标题】:WebAPI MVC Areas with same controller name具有相同控制器名称的 WebAPI MVC 区域
【发布时间】:2015-08-11 10:24:49
【问题描述】:

webapi的结构如下:

App
   -Area
       -MyArea1
         - ControllerA (Route('api/myarea1/controllera'))
       -MyArea2
         - ControllerA  (Route('api/myarea2/controllera')) 

问题是路由 api/myarea1/controllera 和 api/myarea2/controllera 没有被解析。来的是404。

我在某处读到我们需要实现 IHttpControllerSelector 但不确定实现它的最简单方法是什么。如果有其他方法可以做到吗?

任何想法。

编辑: RouteConfig.cs

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

WebApiConfig.cs

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

编辑 2:

   public override void RegisterArea(AreaRegistrationContext context) 
   {
        context.MapHttpRoute(
            name : "MyArea1_default",
            routeTemplate : "MyArea1{controller}/{action}/{id}",
            defaults : new { action = "Index", id = UrlParameter.Optional }
        );
    }

【问题讨论】:

  • 您能发布您的 RouteConfig 文件吗?还有你的 WebApiConfig
  • 你的两个控制器都继承自msdn.microsoft.com/en-us/library/…?
  • 没错 确实如此
  • 你的区域也有路由/webapi配置文件吗?
  • 是的,我已经用其中一个更新了问题,另一个相似。

标签: asp.net-mvc asp.net-web-api routes


【解决方案1】:

如果要使用同名的控制器,需要为每个路由配置指定命名空间。

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapHttpRoute(
        name : "MyArea1_default",
        routeTemplate : "MyArea1{controller}/{action}/{id}",
        defaults : new { action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { "Your.Controller.Namespace.Here" }  
    );
}

供您参考: http://haacked.com/archive/2010/01/12/ambiguous-controller-names.aspx/

【讨论】:

  • 那行不通。我有另一个区域 MyArea3 有 FooController 并且它工作正常。我认为问题在于两个不同区域的控制器名称相同,这是混淆 mvc 路由。
  • 试过了,但没有用。另外我不知道 context.MapHttpRoute() 是否在 MVC 中,而不是在 asp.net webapi 中,因为我无法找到该方法。我使用了 context.MapRoute(...) 但没有运气。
  • MapHttpRoute 在 WebApi 中,MapRoute 在 MVC 中。当您说它不起作用时,您看到了什么错误?
  • @activebiz 找到解决方案了吗?
  • 你能分享一个链接吗?有兴趣阅读更多内容!
猜你喜欢
  • 1970-01-01
  • 2014-04-18
  • 2020-02-13
  • 2017-03-08
  • 2013-06-14
  • 1970-01-01
  • 2019-10-25
  • 2014-08-26
  • 2011-04-26
相关资源
最近更新 更多