在 ASP.NET Core Web Api 中有多个带有多个查询字符串参数的获取方法
Having multiple get-methods with multiple query string parameters in ASP.NET Core Web Api
我正在构建一个 Web api,其中我有一个资源必须具有 3 个获取方法,如下所示:
[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
从查询参数中绑定。所以上面的 url 会匹配动作,但是 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
}
现在您想要的路线将匹配。
注意:您不能将两个操作映射到同一路由 - 路由中间件不知道要映射到哪个 select。因此,从 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
}
进一步阅读:
快速提示:
在 appsettings.json
中将 Microsft
日志级别设置为 Debug
(在标准 Asp.Net 核心 Web 应用程序模板中自动生成),您将获得有关路由的非常有用的信息 selection / 在 kestrel 下 运行 时在控制台输出中路由 selection 时出错。
{
"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);
// ...
}
我正在构建一个 Web api,其中我有一个资源必须具有 3 个获取方法,如下所示:
[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
从查询参数中绑定。所以上面的 url 会匹配动作,但是 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
}
现在您想要的路线将匹配。
注意:您不能将两个操作映射到同一路由 - 路由中间件不知道要映射到哪个 select。因此,从 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
}
进一步阅读:
快速提示:
在 appsettings.json
中将 Microsft
日志级别设置为 Debug
(在标准 Asp.Net 核心 Web 应用程序模板中自动生成),您将获得有关路由的非常有用的信息 selection / 在 kestrel 下 运行 时在控制台输出中路由 selection 时出错。
{
"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);
// ...
}