【发布时间】:2021-02-06 00:43:24
【问题描述】:
我正在将 ASP.NET MVC (.NET Framework) Web 应用程序迁移到 ASP.NET MVC Core 3.1。此应用程序是公司内部的。我们正在借此机会清理一些 API 路由以使其更加 RESTful,例如:/api/Values?id=1 → /api/Values/1。但是,当此应用程序投入生产时,并非所有其他应用程序都能够进行适当的更改,因此我们希望能够同时支持这两种 URL 格式。这可能吗?我的路由设置如下所示:
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.Select().Expand().Filter().OrderBy().Count().MaxTop(null);
endpoints.EnableDependencyInjection();
endpoints.MapODataRoute("ODataRoute", "odata", GetEdmModel());
});
我的控制器如下所示:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : Controller
{
// constructor and dependency injection omitted
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> Get(int id)
{
// method logic omitted
}
}
使用上面的代码,/api/Values/1 可以正常工作,但查询字符串 ?id=1 会导致 404。如果我将属性更改为 [HttpGet],那么查询字符串可以正常工作,但 RESTful 版本不能。到目前为止,这是我尝试过的:
-
[HttpGet("{id}")]+[FromQuery]– REST:404,QS:405(不允许的方法) -
[HttpGet]+[FromQuery] [FromRoute]– 休息:404,QS:200 -
仅限
[HttpGet("{id?}")]– REST:200,QS:404
这可能吗?谢谢。
【问题讨论】:
标签: asp.net-core routes url-routing