ASP.NET MVC中的约定优于配置同样适用于ASP.NET Web API。关于约定优于配置的概念下面引用了一段维基百科上的解释,更多内容可以直接参见维基百科约定优于配置条目。

约定优于配置convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。

本质是说,开发人员仅需规定应用中不符约定的部分。例如,如果模型中有个名为Sale的类,那么数据库中对应的表就会默认命名为sales。只有在偏离这一约定时,例如将该表命名为"products_sold",才需写有关这个名字的配置。

如果您所用工具的约定与你的期待相符,便可省去配置;反之,你可以配置来达到你所期待的方式。

上一篇文章中,我们测试了HTTP GET请求,那么Controller是根据什么来选择相应的Action的呢?这里就用到了ASP.NET Web API的约定。

ASP.NET Web API约定凡是名称为Get或者以Get开头的Action,比如GetEmployee或GetAllEmployees或GetEmployeeById等都用来处理HTTP GET请求。相应的HTTP POST,PUT,DELETE以此类推。重写这些约定可以使用AcceptVerbs特性或HttpGet,HttpPost,HttpPut,HttpDelete特性等。

下面的代码分别演示两种配置的方法:

        [AcceptVerbs("GET")]
        public Employee RetrieveEmployeeById(int id)
        {
            return list.First(e => e.Id == id);
        }

        [HttpGet]
        public Employee RetrieveEmployeeById(int id)
        {
            return list.First(e => e.Id == id);
        }

在我们示例项目中的App_Start/WebApiConfig可以找到Web API 的路由配置:

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

如果将routeTemplate改成"webapi/{controller}/{id}",上一篇文章中的HTTP GET请求就应该改成http://localhost:8396/webapi/employees了。

如果需要在路由模板中加入其它变量,比如组织id,则可以配置如下:

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{orgid}/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional },
                constraints: new { orgid = @"\d+" }
            );

相应的访问地址也要改成http://localhost:8396/api/123/employees

在Action中获取组织id,则需要修改相应的Action:

        public Employee Get(int orgid, int id)
        {
            return list.First(e => e.Id == id);
        }

本篇参考《Practical ASP.NET Web API》一书的1.3 Choosing Configuration over Convention