【问题标题】:Unable to get ASP.NET MVC and Web API routing straight in my mind - getting 404s galore无法在我的脑海中直接获得 ASP.NET MVC 和 Web API 路由 - 大量出现 404
【发布时间】:2015-06-18 18:54:23
【问题描述】:

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

首先,我的控制器,所以你可以看到名称:

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

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

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

所以我发布到 Create 操作方法...

如您所见,我收到错误消息:404 not found - "No HTTP resource was found that matches the request URI

我会喜欢这里的一些方向......

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-web-api2 asp.net-web-api-routing


    【解决方案1】:

    顺序或注册路由很重要,因为请求由匹配模式的第一个路由处理。因为您的默认路线是它始终选择的第一个路线。 您需要将默认路线放在最后一条,并从最受限制的路线开始注册所有路线,并以默认路线结束。 另外我在您的屏幕截图中看到您的某些路线没有完全配置:例如api/PodcastFeeds 路由没有指定控制器(它需要看起来类似于您在第二个屏幕截图中的FeedRouteMap 路由):

    routes.MapHttpRoute(
      name: "PodcastFeeds",
      url: "api/PodcastFeeds/{action}/{id}",
      defaults: new {controller="PodcastFeeds", action="Create", id=UrlParameter.Optional})
    

    作为替代方案,您可以使用attribute routing 来避免此类问题。

    【讨论】:

    • 你能分享你的 Global.asax 内容吗?我需要看看 Application_Start 方法
    • 给你:AreaRegistration.RegisterAllAreas();, FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);, WebApiConfig.Register(GlobalConfiguration.Configuration);, RouteConfig.RegisterRoutes(RouteTable.Routes); 请注意,我在 WebApiConfig.cs 的Register(...) 方法中放置了一个断点,它确实被命中了。
    • 我对 MVC 路由和 Web API 路由如何交互感到困惑,因此我不清楚在哪里进行更改。我应该在 routeconfig 或 webapi 路由配置中更改默认路由吗?关于您的评论:我的一些路由未指定控制器,我已将该映射编辑为:Routes.MapHttpRoute(name:"PodcastFeedsAPI", routeTemplate:"api/PodcastFeeds/{action}", defaults:new { ApiController = "PodcastFeeds", action="Create" }); 但我遇到了同样的错误。 (请注意,url 对我不起作用,我必须做 routeTemplate。也许是因为我是 Web API 2?)
    • 我刚刚发现用api/{Controller}/{Action} 替换api/PodcastFeeds/{Action} 有效。为什么不能将实际的控制器名称放在路由模板中?另外,您之前评论说我的一些路由没有完全配置,因为我没有指定默认控制器。但是,如果我直接在 url 中指定控制器名称和操作名称,例如“host/api/PodcastFeeds/Create”,那么如果没有指定默认值,为什么映射不能工作?
    • 因为您可以创建这样的路由:Routes.MapHttpRoute(name:"PodcastFeedsAPI", routeTemplate:"api/MyController/MyAction", defaults:new { ApiController = "PodcastFeeds", action="Create" }); 因为您可以看到控制器名称与您在路由中的名称不同
    猜你喜欢
    • 1970-01-01
    • 2012-09-28
    • 2011-07-19
    • 2010-10-30
    • 2016-09-28
    • 2012-04-27
    • 1970-01-01
    • 2016-09-16
    • 2014-09-15
    相关资源
    最近更新 更多