0

在 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 项目中有什么不同会导致找不到操作?

4

1 回答 1

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

另请注意,在 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 有任何耦合。

于 2013-01-07T22:06:58.227 回答