使用MVC和Web API注册路由的方式有什么不同
本文关键字:方式 什么 路由 MVC Web API 注册 使用 | 更新日期: 2023-09-27 18:00:06
在我的MVC和WebAPI应用程序中,我看到了两种不同的路由方式。
- 一个用于MVC,它调用RegisterRoutes并传递RouteTable.Routes
- 一个用于Web API,它调用CustomizeConfig并传递GlobalConfiguration.Configuration
对于WebAPI:
WebApiConfig.CustomizeConfig(GlobalConfiguration.Configuration);
public static void Register(System.Web.Http.HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: ApiControllerOnly,
routeTemplate: "api/{controller}");
}
对于MVC:
RouteConfig.RegisterRoutes(RouteTable.Routes);
public static void RegisterRoutes(System.Web.Routing.RouteCollection routes)
{
routes.MapRoute("DefaultRedirect",
"",
new { controller = "Home", action = "Index" });
}
有人能解释一下我在一个或另一个方法调用中注册路由是否有什么不同吗?还有为什么它是这样做的一个使用。
MVC路由在ASP.NET(system.web)路由集合中注册。然而,Web API被设计为在system.Web之上的IIS中运行,或者作为自主机运行而不更改代码。
因此,Web API有一个不同的注册机制,它可以在引擎盖下使用system.Web路由,或者在使用自托管时使用自己的路由系统(支持WCF自托管或Owin主机)。
还有一个很小的区别,Web API路由需要命名路由,而MVC路由则不需要。
与传统的ASP.NET MVC控制器相比,web API的一个显著差异是web API将如何将请求路由到操作方法。
通过web API,所使用的HTTP方法起到了一定的作用。HTTP方法是HTTP消息中使用的动词,常见的动词有get、post、put和delete。这些是web API默认路由的谓词。如果你需要做一些类似webDAV的事情,你也可以处理额外的动词。您可以使用except-verbs属性来执行此操作并处理其他谓词。
web API要做的是,如果有一个"/moiles"请求,web API将查找一个电影控制器,然后在该控制器上查找一个以"Get"开头的方法。因此,我可以有一个名为Get movies的操作,因为这是一个HTTP Get消息,框架将调用Get movie。但您也可以将其称为GET,因为它以字母G-E-T开头,这就是为什么特定的操作方法会收到请求的原因。
web API注册这些路由的方式也略有不同,因为URL中没有供路由引擎挑选的操作,而是使用谓词。如果查看web API的默认路由配置,则使用扩展方法MapHttpRoute完成。
对于Web API,它是:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
对于MVC,它是:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
请注意,对于Web API,URL模板中没有任何操作,还需要注意的是,该操作的路径需要以"API"开头。
看了这些之后,访问控制器(比如Movies)的正确方法是在浏览器上使用/api/Movies作为URL。这将调用get方法,因为我们有一个get请求。
注意:Web API控制器从System.Web.Http.Controller继承,但MVC控制器从System.Web.MVC.Controller.继承。这两个库不同,但作用方式相似。Web API的MapHttpRoute被定义为System.Web.Http类中的扩展方法。MVC的MapRoute在System.Web.MVC中被定义为一个扩展方法。