我正在构建一个Web API,其中有一个资源必须具有3个get方法,如下所示:
[HttpGet]
[Route("{city}/{streetName}/{streetNumber}/{littera}")]
public IActionResult GetByAddress([FromQuery]string city, [FromQuery]string streetName, [FromQuery]int streetNumber, [FromQuery]string littera)
{
var model = _availabilityService.FindByAddress(city, streetName, streetNumber, littera);
return Ok(model);
}
[HttpGet("{pointId}")]
public IActionResult GetByPointId(string pointId)
{
var model = _availabilityService.FindByPointId(pointId);
return Ok(model);
}
[HttpGet]
[Route("{xCoordinate}/{yCoordinate}")]
public IActionResult GetByCoordinates([FromQuery]decimal xCoordinate, [FromQuery]decimal yCoordinate)
{
var model = _availabilityService.FindByCoordinates(xCoordinate, yCoordinate);
return Ok(model);
}
仅具有一个参数(pointId)的get方法可以正常工作,因为它不被视为查询字符串,而被视为id。但是,看来剩下的2种方法在ASP.NET中是无法区分的。
我在这里真的很茫然,无法弄清楚为什么它不起作用。我能够解决的问题是,如果我删除其中一种方法,则另一种效果很好。
关于我在做什么错的任何建议吗?
仅供参考,相应的url:s应该如下所示:
api/1.0/availabilities?city=Metropolis&streetName=Superstreet&streetNumber=1&littera=A
和
/api/1.0/availabilities?xCoordinate=34.3444&yCoordinate=66.3422
谢谢!
首先,您要混合使用RouteParameters和QueryParameters。
这:
[HttpGet]
[Route("{xCoordinate}/{yCoordinate}")]
public IActionResult GetByCoordinates([FromQuery]decimal xCoordinate, [FromQuery]decimal yCoordinate)
{
var model = _availabilityService.FindByCoordinates(xCoordinate, yCoordinate);
return Ok(model);
}
将控制器动作映射GetByCoordinates
到这样的路由:
/api/1.0/availabilities/34.3444/66.3422
但是,您还指定了您期望的内容,xCoordinate
并将yCoordinate
其与查询参数绑定。因此,上述网址将会匹配的动作,但xCoordinate
并yCoordinate
会被绑定到它的默认值(在这种情况下为0)。
因此,要获得所需的路线,您不应声明路线参数:
[HttpGet]
[Route("")] // <- no route parameters specified
public IActionResult GetByCoordinates([FromQuery]decimal xCoordinate, [FromQuery]decimal yCoordinate)
{
// will be matched by e.g.
// /api/1.0/availabilities?xCoordinate=34.3444&yCoordinate=66.3422
}
现在您所需的路线将匹配。
注意:您不能将两个动作映射到同一路由-路由中间件不会知道要选择哪个动作。因此,从中删除路由参数也可以GetByAddress
将两个操作有效地映射到同一条路由:
/api/1.0/availabilities?{any=number&of=query¶meters=here}
因此,您将不得不通过其他路线段来区分它们。
[HttpGet]
[Route("address")] // <--
public IActionResult GetByAddress([FromQuery]string city, [FromQuery]string streetName, [FromQuery]int streetNumber, [FromQuery]string littera)
{
// will be matched by e.g.
// api/1.0/availabilities/address?city=Metropolis&streetName=Superstreet&streetNumber=1&littera=A
}
进一步阅读:
小建议:
将Microsft
loglevel设置为Debug
in appsettings.json
(在标准Asp.Net Core WebApplication模板中自动生成),当在红est下运行时,在控制台输出中的路由选择时,您将获得有关路由选择/错误的非常有用的信息。
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Debug"
}
或将调试记录器设置StartUp.cs
为LogLevel.Debug
,您可以直接在Visual Studio中的调试输出中获得相同的信息。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// ...
loggerFactory.AddDebug(LogLevel.Debug);
// ...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句