Web API 路由无法识别参数
Web API Routing Not Recognising Parameters
我有以下 WebAPI 控制器:
namespace MyApp.WebApi.Controllers
{
[RoutePrefix("api/listing")]
public class ListingController : ApiController
{
[Route("{firstparam:int?}/{nextparam:int?}")]
public IEnumerable<ListItem> Get(int firstparam = 100, int nextparam = 12)
{
// firstparam is always 100, and nextparam is always 12
但是,我尝试指定 URL:
http://localhost:56004/#/listing?firstparam=2
如果我这样指定 URL:
http://localhost:56004/#/listing/2
然后就断路由了
显然我遗漏了一些关于路由的信息;请问有人能指出我正确的方向吗?
您可以尝试在 Get() 方法的参数中使用 [FromUri] 属性来提取任何传递到“/listing”uri 的查询参数以及由 int 组成的 class属性 firstparam 和 secondparam.
namespace MyApp.WebApi.Controllers
{
[RoutePrefix("api/listing")]
public class ListingController : ApiController
{
[Route("")]
[HttpGet]
public IEnumerable<ListItem> Get([FromUri] ClassRepresentingParams params)
{
希望对您有所帮助。
您正在使用多个可选参数,这些参数不适用于 routeTemplates。通常最后一个参数往往是可选参数。
文档:Attribute Routing in ASP.NET Web API 2: Optional URI Parameters and Default Values
首先确保属性路由已启用
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
得到你想要的
[RoutePrefix("api/listing")]
public class ListingController : ApiController {
//GET api/listing
//GET api/listing?firstparam=x
//GET api/listing?nextparam=y
//GET api/listing?firstparam=x&nextparam=y
[HttpGet]
[Route("")]
public IEnumerable<ListItem> Get(int firstparam = 100, int nextparam = 12) { ... }
}
具有多个可选内联参数的问题是路由器不知道要使用哪个,这就是为什么它们往往位于 url.
末尾的原因
然而,要像您在示例中提到的那样让它们内联,您将需要多条路线。
[RoutePrefix("api/listing")]
public class ListingController : ApiController {
//GET api/listing
[HttpGet]
[Route("")]
public IEnumerable<ListItem> Get() { return Get(100, 12); }
//GET api/listing/2
//GET api/listing/2/5
[HttpGet]
[Route("{firstparam:int}/{nextparam:int?}")]
public IEnumerable<ListItem> Get(int firstparam, int nextparam = 12) { ... }
}
我有以下 WebAPI 控制器:
namespace MyApp.WebApi.Controllers
{
[RoutePrefix("api/listing")]
public class ListingController : ApiController
{
[Route("{firstparam:int?}/{nextparam:int?}")]
public IEnumerable<ListItem> Get(int firstparam = 100, int nextparam = 12)
{
// firstparam is always 100, and nextparam is always 12
但是,我尝试指定 URL:
http://localhost:56004/#/listing?firstparam=2
如果我这样指定 URL:
http://localhost:56004/#/listing/2
然后就断路由了
显然我遗漏了一些关于路由的信息;请问有人能指出我正确的方向吗?
您可以尝试在 Get() 方法的参数中使用 [FromUri] 属性来提取任何传递到“/listing”uri 的查询参数以及由 int 组成的 class属性 firstparam 和 secondparam.
namespace MyApp.WebApi.Controllers
{
[RoutePrefix("api/listing")]
public class ListingController : ApiController
{
[Route("")]
[HttpGet]
public IEnumerable<ListItem> Get([FromUri] ClassRepresentingParams params)
{
希望对您有所帮助。
您正在使用多个可选参数,这些参数不适用于 routeTemplates。通常最后一个参数往往是可选参数。
文档:Attribute Routing in ASP.NET Web API 2: Optional URI Parameters and Default Values
首先确保属性路由已启用
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
得到你想要的
[RoutePrefix("api/listing")]
public class ListingController : ApiController {
//GET api/listing
//GET api/listing?firstparam=x
//GET api/listing?nextparam=y
//GET api/listing?firstparam=x&nextparam=y
[HttpGet]
[Route("")]
public IEnumerable<ListItem> Get(int firstparam = 100, int nextparam = 12) { ... }
}
具有多个可选内联参数的问题是路由器不知道要使用哪个,这就是为什么它们往往位于 url.
末尾的原因然而,要像您在示例中提到的那样让它们内联,您将需要多条路线。
[RoutePrefix("api/listing")]
public class ListingController : ApiController {
//GET api/listing
[HttpGet]
[Route("")]
public IEnumerable<ListItem> Get() { return Get(100, 12); }
//GET api/listing/2
//GET api/listing/2/5
[HttpGet]
[Route("{firstparam:int}/{nextparam:int?}")]
public IEnumerable<ListItem> Get(int firstparam, int nextparam = 12) { ... }
}