在Asp.net WebApi2中
当api / values / 9b858599-7639-45da-acd6-a1323fb019b5被调用时,将调用操作。
具有可选参数的操作。
当api / values / 9b858599-7639-45da-acd6-a1323fb019b5?maxRecords = 100或 api / values /?maxRecords = 100 GetProducts调用了操作。
在Asp.net Core中
但是在asp.net核心中,当api / values / 9b858599-7639-45da-acd6-a1323fb019b5称为GetProducts时,将调用操作。我想在不更改现有网址的情况下调用Get action。
如何在Asp.net core 2.0中解决此问题
Contoller
[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" };
}
}
Startup.cs
app.UseMvc(routes =>
{
routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute("DefaultApi", "api/{controller}/{id?}");
});
答案 0 :(得分:1)
虽然不理想,但这是一个临时错号,直到您可以更新客户端呼叫为止。您可以尝试此操作,如果,可以假定您必须具有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" };
}
答案 1 :(得分:0)
您的URI没有关注的RESTful惯例。坦白说,我一开始看不到您是如何完成这项工作的,因为同样的问题本应导致ASP.NET Web Api出现,但是您很可能很幸运地意识到在ASP.NET中完成路由的方式网络Api。 ASP.NET核心手柄路由完全不同。
无论如何,对于多个产品的列表中选择一个路线应的不的包含在实际的URI的ID。换句话说:
df3 <- data.frame(PLOT = c(82708, 88503, 86560, 89773, 82199, 84113), CONDID = c(1, 2, 1, 1, 1, 1))
df3
有关的东西等的过滤,排序等的多条记录,这些应该是查询字符串的一部分。这包括像/api/values - Multiple values
/api/values/{id} - Single value
:
startRecordId
消除路线中的歧义,您将没有任何问题。长和短,即使在一个路径段中它是可选的,也不能有两个路径都在同一路径段中接受/api/values?startRecordId={id}
。将Guid
移到查询字符串中,无论如何这都是正确的方法,您一切顺利。
答案 2 :(得分:0)
您可以组合动作并根据提供的值来更改行为;
//https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5
//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)
{
if (startRecordId.HasValue && !maxRecords.HasValue)
return "value";
else
return new string[] { "value1", "value2" };
}