我来自一个沉重的Java/Spring背景,并试图将一些知识转移到ASP.NET核心6。
在Spring中,在RestController上,我能够根据查询参数的存在来路由请求。
因此,具有uri:/students?firstName=Kevin的/students?firstName=Kevin可以被路由到与uri:/students的HttpRequest不同的控制器方法。
在Web 6中,在阅读了一些示例并阅读了ASP.NET的文档之后,我无法确定等效的内容是否可行。
以下是我正在尝试实现的目标,这是否可能使用两种方法和路由配置来根据查询参数来区分要调用哪个控制器方法?
[ApiController]
[Route("Students")]
public class StudentHomeProfileController : ControllerBase
{
[HttpGet] //Route here when no parameters provided
public async Task<ActionResult<IEnumerable<Student>>> GetStudentAsync()
{
/* Code omitted */
}
[HttpGet] //Route here when firstName query param provided
public async Task<ActionResult<IEnumerable<Student>>> SearchStudentAsync([FromQuery] string firstName)
{
/* Code omitted */
}
}发布于 2022-01-08 12:28:43
您正在尝试使用query params来区分API调用。这不是做这个的方法。如果您想分离调用,则可能应该使用path params。
在核心- https://learn.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-6.0中阅读更多关于路由的信息
发布于 2022-02-22 06:21:08
虽然按查询参数进行筛选并不是随ASP.NET核心一起提供的,但是单独提供这个功能并不太困难。
在可扩展性方面,ASP.NET有一些超能力,其中之一是IActionConstraint,它
支持条件逻辑,以确定关联操作是否有效,以便为给定请求选择。(来源)
创建一个注释来筛选查询参数是非常容易的
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class QueryParameterConstraintAttribute : Attribute, IActionConstraint
{
private readonly string _parameterName;
public QueryParameterConstraintAttribute(string parameterName)
{
this._parameterName = parameterName;
}
public bool Accept(ActionConstraintContext context)
{
return context.RouteContext.HttpContext.Request.Query.Keys.Contains(this._parameterName);
}
public int Order { get; }
}剩下的就是用这个约束注释控制器方法
[HttpGet] //Route here when firstName query param provided
[QueryParameterConstraint("firstName")]
public async Task<ActionResult<IEnumerable<Student>>> SearchStudentAsync([FromQuery] string firstName)
{
/* Code omitted */
}在一个快速测试中,我能够确认它似乎按照预期工作,即使您为不同的查询参数添加了这些属性中的多个(如果所有条件匹配,则调用路由)。
(请注意,这是用.NET Core2.1测试的。不管怎么说,.NET 6也是一样的)
发布于 2022-01-08 12:25:31
我认为您正在寻找类似的东西,您需要在"HttpGet“属性中指定参数
[Route("api/[controller]")]
[ApiController]
public class Test2Controller : ControllerBase
{
[HttpGet] // GET /api/test2
public IActionResult ListProducts()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("{id}")] // GET /api/test2/xyz
public IActionResult GetProduct(string id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[HttpGet("int/{id:int}")] // GET /api/test2/int/3
public IActionResult GetIntProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[HttpGet("int2/{id}")] // GET /api/test2/int2/3
public IActionResult GetInt2Product(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}https://stackoverflow.com/questions/70632225
复制相似问题