Mov*_*vva 2 c# asp.net-core asp.net-core-routing asp.net-core-2.2
在 Asp.net WebApi2 中
当调用 api/values/9b858599-7639-45da-acd6-a1323fb019b5 时,调用 get Action。
带有可选参数的操作。
当调用 api/values/9b858599-7639-45da-acd6-a1323fb019b5?maxRecords=100 或 api/values/?maxRecords=100 GetProducts Action 时。
在 Asp.net Core 中
但是在 asp.net 核心中,当 api/values/9b858599-7639-45da-acd6-a1323fb019b5 被调用时 GetProducts 动作被调用。我想在不更改现有 url 的情况下调用 Get 操作。
如何在 Asp.net core 2.0 中解决此问题
控制器
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
//https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5
[HttpGet("{productId:Guid}", Order = 1)]
public ActionResult<string> Get(Guid productId)
{
return "value1";
}
//https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5?maxRecords=100
//https://localhost:44323/api/values/?maxRecords=100
[HttpGet("{startRecordId:Guid?}")]
public ActionResult<IEnumerable<string>> GetProducts(Guid? startRecordId, int maxRecords, DateTimeOffset? minimumChangeDate = null)
{
return new string[] { "value1", "value2" };
}
}
Run Code Online (Sandbox Code Playgroud)
启动文件
app.UseMvc(routes =>
{
routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute("DefaultApi", "api/{controller}/{id?}");
});
Run Code Online (Sandbox Code Playgroud)
虽然不理想,这是一个临时的鞋拔,直到您可以更新客户端调用。你可以试试这个,如果你可以假设你必须有一个 maxRecords QueryString。因为如果它默认为 0,则它是无用的,除非在它为 0 的情况下您有适当的逻辑。
//https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5
[HttpGet("{productId:Guid}", Order = 1)]
public ActionResult<string> Get(Guid productId)
{
return "value1";
}
//https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5?maxRecords=100
//https://localhost:44323/api/values/?maxRecords=100
[HttpGet("{startRecordId:Guid?}")]
public ActionResult<IEnumerable<string>> GetProducts(Guid? startRecordId, [FromQuery] int maxRecords, [FromQuery] DateTimeOffset? minimumChangeDate = null)
{
if (!Request.GetDisplayUrl().Contains(nameof(maxRecords)) &&
startRecordId.HasValue)
{
return Get(startRecordId.Value);
}
return new string[] { "value1", "value2" };
}
Run Code Online (Sandbox Code Playgroud)