在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项目中有什么不同会导致无法找到操作?
答案 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个文件:
~/App_Start/RouteConfig.cs
- 您放置所有标准MVC路线的地方~/App_Start/WebApiConfig.cs
- 您放置所有Web API配置(包括路由,自定义格式化程序......)您还会注意到他们正在使用两种完全不同的方法。不要忘记Web API可以自托管,例如在控制台应用程序中。这就是微软决定从头开始实现一切的原因。他们不希望与ASP.NET MVC有任何耦合。