为什么Web Api路由配置默认不包括动作参数?

时间:2014-07-21 23:13:15

标签: c# asp.net-mvc asp.net-web-api

我对WebApi有点新意,所以也许有人可以向我解释一下,为WebApis添加的默认路由是:

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

所以给定一个看起来像这样的ApiController:

public class LookupController : ApiController
{

    [HttpGet] 
    public IHttpActionResult GetCountries()
    { 
        // do stuff
        return Ok();
    }

    [HttpGet] 
    public IHttpActionResult GetStates()
    { 
        // do stuff
        return Ok();
    }

}

如何知道要拨打哪个动作?这不对吗?

默认路线不应该更像:

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

或者你应该每个ApiController只有一个GET / UPDATE / DELETE等?这真的不适合某些场景...

2 个答案:

答案 0 :(得分:1)

严格来说,你的控制器应该永远不会那样。开箱即用的想法是控制器处理对单个实体(例如,客户)的请求,并且映射到HTTP动词的操作针对该实体进行操作。所以在正常情况下你的控制器看起来像下面这样(使用脚手架对一个简单的模型类创建,为简洁省略了方法体):

public class CustomerController : ApiController
{
    public IQueryable<Customer> GetCustomers()
    {
    }

    [ResponseType(typeof(Customer))]
    public IHttpActionResult GetCustomer(int id)
    {
    }

    [ResponseType(typeof(void))]
    public IHttpActionResult PutCustomer(int id, Customer customer)
    {
    }

    [ResponseType(typeof(Customer))]
    public IHttpActionResult PostCustomer(Customer customer)
    {
    }

    [ResponseType(typeof(Customer))]
    public IHttpActionResult DeleteCustomer(int id)
    {
    }
}

如果您要执行更多面向业务的操作(例如BillCustomer),而不仅仅是基本的CRUD操作,我建议为这些操作创建单独的路由。我们在其中一个应用程序中执行了此操作,并创建了一个很好的逻辑分离例如:

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

config.Routes.MapHttpRoute(
    name: "RpcApi",
    routeTemplate: "rpc/{controller}/{action}"
);

答案 1 :(得分:1)

Web API根据路由数据确定要调用的方法。您无需指定操作,因为Web API将使用请求的动词(GET,POST,DELETE等)

如果您想在控制器中执行多个GET操作,可以为每个操作指定路由。

[Route("api/lookup/countries"]
[HttpGet] 
    public IHttpActionResult GetCountries()
    { 
        // do stuff
        return Ok();
    }

[Route("api/lookup/states"]
    [HttpGet] 
    public IHttpActionResult GetStates()
    { 
        // do stuff
        return Ok();
    }

此处提供了更多信息http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api