ASP.NET Web API 2:WebApiConfig.Register无参数调用及RouteConfig疑问
我正在使用ASP.NET Web API 2.0创建RESTful服务,目前我的RouteConfig.cs类代码如下:
public class RouteConfig { 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 } ); } }
我有个疑问:在Global.asax.cs文件中,WebApiConfig.Register方法为何无需传入参数即可被调用?
这其实是ASP.NET Web API框架借助委托类型和自动实例化机制实现的简化调用,我来给你拆解清楚:
首先,先明确你看到的调用场景——在默认的项目模板里,Global.asax.cs的Application_Start方法中,WebApiConfig.Register并不是直接以无参方式调用的,而是通过GlobalConfiguration.Configure方法间接调用的:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); // 核心调用逻辑在这里 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
核心原因分为三点:
WebApiConfig.Register的方法签名匹配委托要求
默认的WebApiConfig.cs里,Register方法的签名是:public static void Register(HttpConfiguration config) { // Web API路由、格式器等配置逻辑 }它接受一个
HttpConfiguration类型的参数,且没有返回值,刚好符合特定委托的要求。GlobalConfiguration.Configure接受委托参数Configure方法的定义是:public static void Configure(Action<HttpConfiguration> configurationCallback)这里的
Action<HttpConfiguration>是一个委托类型,代表“接受HttpConfiguration参数、无返回值的方法”。因为WebApiConfig.Register的签名完全匹配这个委托,所以我们可以直接把方法名传递给Configure。框架自动处理参数实例化
当你调用GlobalConfiguration.Configure(WebApiConfig.Register)时,ASP.NET框架会自动创建HttpConfiguration的实例,然后把这个实例传入WebApiConfig.Register方法中执行——相当于框架帮你完成了参数的传递工作,所以你看起来像是“无需传参调用”。
对比你当前的RouteConfig.RegisterRoutes就很清楚了:它是给MVC路由用的,需要你手动传入RouteTable.Routes作为参数;而Web API的配置则借助委托和框架的自动实例化,简化了调用流程。
如果尝试直接写WebApiConfig.Register()(不带参数),编译器会立刻报错,因为它明确需要一个HttpConfiguration类型的参数——这也能侧面验证我们上面的结论。
内容的提问来源于stack exchange,提问作者Suresh Negi

