gpt4 book ai didi

c# - 如何在 ASP.NET CORE 3.0 中配置路由以使用带有 [FromQuery] 参数的重载 [HttpGet] 方法?

转载 作者:行者123 更新时间:2023-12-04 10:54:54 28 4
gpt4 key购买 nike

抱歉标题,我不擅长它们,如果您知道更好的标题来描述问题的内容,请告诉我。
所以我有两种方法,第一个是获取所有列表项,第二个是获取所有列表项,但是,第二个方法有一个查询参数,我用来过滤,第二个方法还返回与第一个方法不同的对象。由于我有 2 个 Http get 方法去相同的路线,当我调用我得到的方法之一时:

Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: Therequest matched multiple endpoints. Matches: .....


如何在不合并这两种方法或使用可选参数或更改一种方法的路径的情况下解决此问题?如果可能的话??
示例代码:
// GET: api/Resources
[HttpGet]
public async Task<ActionResult<ICollection<Data>>> GetAll()
{
return Ok(await Service.GetAll());
}

// GET: api/Resources
[HttpGet]
public async Task<ActionResult<Data2>> GetAll([FromQuery]int parameter)
{
return Ok(await Service.GetAll2(parameter));
}
在配置方法中,我有:
app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthentication();

app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});

编辑:按照评论的建议尝试在这样的配置中使用操作......
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute("default", "{controller}/{action}/{id?}");
});
它没有用,因为当我执行 get 请求时调用了错误的方法,
比如第一个getall方法:api/resources/getall
下面的方法被触发而不是导致错误,因为 getall 不是 int ...
// GET: api/Resources/5
[HttpGet("{id}")]
public async Task<ActionResult<Data>> GetById(int id)
{
return Ok(await Service.GetById(id));
}

重现示例>> https://drive.google.com/open?id=15EB1_kK-c_qyhRS0QvVlKnhuUbFjyN12

现在让操作正常工作,必须更改 Controller 中的属性路由...
[Route("api/[controller]/[action]")]
[ApiController]
public class ResourcesController : ControllerBase
{
// GET: api/Resources/GetAll
[HttpGet]
public ActionResult<ICollection<string>> GetAll()
{
return Ok(new List<string>() { "foo", "bar" });
}

// GET: api/Resources/GetAll2?parameter="bar"
[HttpGet]
public ActionResult<string> GetAll2([FromQuery]string parameter)
{
return Ok(parameter);
}

// GET: api/Resources/GetById/5
[HttpGet("{id}")]
public ActionResult<int> GetById(int id)
{
return Ok(id);
}
}
虽然因为没有不同的路径就不可能实现这一点,我将只更改一种方法的路径,而不是在 Controller 中使用 Action ,并且在调用方法时必须在路径中添加 Action 名称。
更新 1:几周后我遇到的其他可能有效(未测试)的方法是使用路由约束,如 this video 所示。 .
更新2:将近一年后,我决定查找查询参数约束,
我遇到了 this question在stackoverflow上,答案是不可能,尽管问题很老所以......

最佳答案

作为引用,我创建了一个新的 web api asp.net core 3 项目。

还假设您在 上注册了默认路由。启动.cs。 endpoints.MapDefaultControllerRoute();
添加

[Route("api/[controller]/[action]")]
[ApiController]

在您的 Controller 开始时会覆盖您的启动,因此您不必担心其他 Controller 。

Also you cannot achieve this with the Id being optional parameter. You would get ambiguity. Since GetAll() and GetAll(int parameter) are precisely the same, since we have declared the parameter as optional. This is why you get the error.


using Microsoft.AspNetCore.Mvc;

namespace WebApiTest.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class ResourceController : ControllerBase
{

[HttpGet]
//api/Resource/GetAll
public IActionResult GetAll()
{
return Content("I got nth");
}

//GET: //api/Resource/GetAll/2
[HttpGet("{parameter}")]
public IActionResult GetAll(int parameter)
{
return Ok($"Parameter {parameter}");
}

}
}

另请注意,在第二个 GetAll() 中,我在 HttpGet 中添加了参数。

这只是为了更新路由引擎,该路由将具有一个参数,因为在我的文件顶部的通用级别,我正在注册直到操作。

对于更多参数,您可以这样做。 [HttpGet({parameter}/{resourceId})] .

那么您的路线将与此类似 api/Resource/GetAll/2/4 .

关于c# - 如何在 ASP.NET CORE 3.0 中配置路由以使用带有 [FromQuery] 参数的重载 [HttpGet] 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59268581/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com