无法在我的脑海中直接获得ASP.NET MVC和Web API路由-获得大量404

无法在我的脑海中直接获得ASP.NET MVC和Web API路由-获得大量404,asp.net,asp.net-mvc,asp.net-web-api2,asp.net-web-api-routing,Asp.net,Asp.net Mvc,Asp.net Web Api2,Asp.net Web Api Routing,我在ASP.NET MVC+WebAPI应用程序中遇到路由问题。我觉得我这里有一个移动的目标,因为当我添加或更改一条路线时,我打破了另一条。这是我的具体例子 首先是我的控制器,因此您可以看到名称: 接下来是我的MVC路由配置(我知道我的配置可能是重复的,但这是因为我正在尝试): 还有我的Web API路由配置(我知道我的配置可能非常重复,但这是因为我正在尝试): 作为一个路由问题示例,以下是PodcastFeeds API控制器: 所以我发布到创建动作方法 正如您所看到的,我得到了错误

我在ASP.NET MVC+WebAPI应用程序中遇到路由问题。我觉得我这里有一个移动的目标,因为当我添加或更改一条路线时,我打破了另一条。这是我的具体例子

首先是我的控制器,因此您可以看到名称:

接下来是我的MVC路由配置(我知道我的配置可能是重复的,但这是因为我正在尝试):

还有我的Web API路由配置(我知道我的配置可能非常重复,但这是因为我正在尝试):

作为一个路由问题示例,以下是PodcastFeeds API控制器:

所以我发布到创建动作方法

正如您所看到的,我得到了错误:
404notfound-“没有找到与请求URI匹配的HTTP资源


我希望这里有一些指导…

由于请求是由符合模式的第一条路由处理的,所以顺序或注册路由很重要。因为您的默认路由是它始终选择的第一条路由。您需要将默认路由设置为最后一条,并从最受限制的路径开始注册所有路由g并以默认值结尾。我在您的屏幕截图中也看到一些路由未完全配置:例如
api/PodcastFeeds
路由未指定控制器(它需要与第二个屏幕截图中的
FeedRouteMap
路由相似):


作为一种替代方法,您可以使用它来避免此类问题。

您可以共享您的Global.asax内容吗?我需要查看应用程序的启动方法。您可以这样做:
AreaRegistration.RegisterAlareas();FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);,WebApiConfig.Register(GlobalConfiguration.Configuration),RouteConfig.RegisterRoutes(RouteTable.Routes);
注意,我在WebApiConfig.cs'
寄存器(…)中放置了一个断点
方法,它确实被击中了。我对MVC路由和Web API路由如何交互感到困惑,因此我不清楚在哪里进行更改。我应该在routeconfig或webapi路由配置中进行默认路由更改吗?关于您的评论:我的一些路由没有指定控制器,我已将该映射编辑为:
Routes.maphttprote(名称:“PodcastFeedsAPI”,routeTemplate:“api/PodcastFeeds/{action}”,默认值:new{ApiController=“PodcastFeeds”,action=“Create”});
但我得到了相同的错误。(注意url对我不起作用,我必须做routeTemplate。可能是因为我是Web api 2。)我刚刚发现替换
api/PodcastFeeds/{Action}
with
api/{Controller}/{Action}
有效。为什么不将实际的控制器名称放在路由模板中有效?另外,您之前评论说,我的一些路由没有完全配置,因为我没有指定默认控制器。但是如果我直接在url中指定控制器名称和操作名称,例如“,为什么在没有指定默认值的情况下映射不能工作?因为您可以创建这样的路由:
Routes.maphttprote(名称:“PodcastFeedsAPI”,路由模板:“api/MyController/MyAction”,默认值:new{ApiController=“PodcastFeeds”,action=“create”});
正如您所见,控制器名称与路由中的控制器名称不同
routes.MapHttpRoute(
  name: "PodcastFeeds",
  url: "api/PodcastFeeds/{action}/{id}",
  defaults: new {controller="PodcastFeeds", action="Create", id=UrlParameter.Optional})