In Asp.net WebApi2
当调用api/values/9b858599-7639-45da-acd6-a1323fb019b5时,会调用get操作。
带有可选参数的操作。
当调用api/values/9b858599-7639-45da-acd6-a1323fb019b5?maxRecords=100或api/ GetProducts /?maxRecord=100 GetProducts操作时。
在Asp.net核中的应用
但是在api/values/9b858599-7639-45da-acd6-a1323fb019b5内核中,当asp.net被调用时,GetProducts操作将被调用。我想在不改变现有网址的情况下给Get行动打电话。
如何在Asp.net核心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?}");
});发布于 2019-02-14 19:48:13
虽然不理想,但这是暂时的,直到您可以更新客户端调用。您可以尝试这样做,,如果,您可以假设您必须有一个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" };
}发布于 2019-01-30 18:50:47
您的URI没有遵循RESTful约定。坦率地说,我看不出您最初是如何完成这一工作的,因为同样的问题应该会导致ASP.NET Web,但是您可能只是对ASP.NET Web的路由方式感到幸运。ASP.NET核心完全不同地处理路由。
无论如何,多个产品列表的路由不应该包含实际URI中的id。换言之:
/api/values - Multiple values
/api/values/{id} - Single value对于诸如过滤、排序等多条记录,这些记录应该是查询字符串的一部分。其中包括类似于startRecordId的内容
/api/values?startRecordId={id}消除你路线上的歧义,你就没有问题了。长和短,您不能同时在相同的路径段中接受一个Guid,即使它在一个路径段上是可选的。将startRecordId移动到查询字符串中,这是进行查询的正确方法,您可以继续使用它。
发布于 2019-08-20 03:34:44
您可以组合您的操作,并根据参数提供的值来更改行为;
//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" };
}https://stackoverflow.com/questions/54445757
复制相似问题