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

时间:2013-01-07 22:03:22

标签: 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 }
  );

}

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

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

和网址

/api/brand/list/mytype/mysearchtext

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

1 个答案:

答案 0 :(得分:7)

  

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

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

因此,如果要配置Web API路由,则需要使用MapHttpRoute扩展方法,而不是仅用于标准MVC控制器的MapRoute。不要将基础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 }
);

另请注意,在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配置(包括路由,自定义格式化程序......)
  3. 您还会注意到他们正在使用两种完全不同的方法。不要忘记Web API可以自托管,例如在控制台应用程序中。这就是微软决定从头开始实现一切的原因。他们不希望与ASP.NET MVC有任何耦合。