我对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等?这真的不适合某些场景...
答案 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