为什么这个MVC4 Web API路由与ASP.NET网站项目相比不起作用?

Chr*_*isP 0 asp.net asp.net-mvc asp.net-mvc-4

在MVC4 Web API项目中,下面有"itemtypelist"路由

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 }
  );

  routes.MapRoute(
  name: "itemtypelist",
  url: "{controller}/list/{itemtype}/{searchtext}",
  defaults: new { controller = "home", action = "list", itemtype = (string)null, searchtext = (string)null }
  );

}
Run Code Online (Sandbox Code Playgroud)

它旨在映射到以下控制器操作

[AcceptVerbs("GET", "POST")]
public IEnumerable<Repository.ViewModel.Brand> List(string itemType, string searchText)
Run Code Online (Sandbox Code Playgroud)

和URL

/api/brand/list/mytype/mysearchtext
Run Code Online (Sandbox Code Playgroud)

但是,URL返回404消息.此路由和控制器操作在网站项目中工作,但不在Web API项目中工作.MVC4 Web API项目中有什么不同会导致无法找到操作?

Dar*_*rov 7

MVC4 Web API项目中有什么不同会导致无法找到操作?

一切都不一样.绝对一切.从配置API路由的方式开始,经历整个模型绑定,直到基本控制器.所以,如果你想开发一个Web API,基本上你会忘记你对ASP.NET MVC的所有了解.微软已经复制了每一件事.这是一个新设计,新程序集,新命名空间,新API.与ASP.NET MVC无关.

因此,如果要配置Web API路由,则需要使用MapHttpRoute扩展方法,而不是MapRoute仅用于标准MVC控制器.不要将基础System.Web.Mvc.Controller(您习惯在MVC应用程序中使用)与System.Web.Http.ApiController(API控制器的基类)混淆.那是两个完全不同的野兽.

所以这里是如何配置ApiController的路由:

GlobalConfiguration.Configuration.Routes.MapHttpRoute(
    name: "DefaultAPI",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

另请注意,在RESTful API中,您未在路径中指定操作名称.它是从用于使用它的HTTP动词中假设的.这是good article我建议您阅读Web API中的RESTful路由.

顺便说一下,如果您使用Internet或空模板创建新的ASP.NET MVC 4项目,您会注意到Visual Studio将为您创建2个文件:

  1. ~/App_Start/RouteConfig.cs - 放置所有标准MVC路线的地方
  2. ~/App_Start/WebApiConfig.cs - 放置所有Web API配置的位置(包括路由,自定义格式化程序......)

您还会注意到他们使用了两种完全不同的方法.不要忘记Web API可以自托管,例如在控制台应用程序中.这就是微软决定从头开始实现一切的原因.他们不希望与ASP.NET MVC有任何耦合.