Handle multiple endpoints in .NET Core 3.1 Web API by Query Params(在.NET Core 3.1 Web API中按查询参数处理多个端点)
问题描述
我正在将控制器从.NET Framework迁移到.NET Core,并希望与以前版本的API调用兼容。我在处理来自查询参数的多个路由时遇到问题。我的示例控制器:
[Route("/api/[controller]")]
[Route("/api/[controller]/[action]")]
public class StaticFileController : ControllerBase
{
[HttpGet("{name}")]
public HttpResponseMessage GetByName(string name)
{
}
[HttpGet]
public IActionResult Get()
{
}
}
调用api/StaticFile?name=someFunnyName将引导我执行Get()操作,而不是预期的GetByName(string name)。
我要实现的目标:
- 调用get
api/StaticFile->;转到Get()操作 - 调用GET
api/StaticFile?name=someFunnyName->;转到GetByName()操作
我的app.UseEndpoints()发件人Startup.cs只有以下几行:
endpoints.MapControllers();
endpoints.MapDefaultControllerRoute();
如果我在任何地方都使用[HttpGet]并添加([FromQuery] string name),则会得到AmbiguousMatchException: The request matched multiple endpoints
感谢您抽出时间帮助我(也可能帮助其他人)
推荐答案
我要实现的目标:
- 调用Get API/StaticFile->;转到get()操作
- 调用Get API/StaticFile?Name=omeFunnyName->;转到GetByName()操作
要实现基于查询字符串将请求与预期操作匹配的上述要求,您可以尝试实现自定义ActionMethodSelectorAttribute并将其应用于您的操作,如下所示。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class QueryStringConstraintAttribute : ActionMethodSelectorAttribute
{
public string QueryStingName { get; set; }
public bool CanPass { get; set; }
public QueryStringConstraintAttribute(string qname, bool canpass)
{
QueryStingName = qname;
CanPass = canpass;
}
public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
{
StringValues value;
routeContext.HttpContext.Request.Query.TryGetValue(QueryStingName, out value);
if (QueryStingName == "" && CanPass)
{
return true;
}
else
{
if (CanPass)
{
return !StringValues.IsNullOrEmpty(value);
}
return StringValues.IsNullOrEmpty(value);
}
}
}
应用于操作
[Route("api/[controller]")]
[ApiController]
public class StaticFileController : ControllerBase
{
[HttpGet]
[QueryStringConstraint("name", true)]
[QueryStringConstraint("", false)]
public IActionResult GetByName(string name)
{
return Ok("From `GetByName` Action");
}
[HttpGet]
[QueryStringConstraint("name", false)]
[QueryStringConstraint("", true)]
public IActionResult Get()
{
return Ok("From `Get` Action");
}
}
测试结果
这篇关于在.NET Core 3.1 Web API中按查询参数处理多个端点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在.NET Core 3.1 Web API中按查询参数处理多个端点
基础教程推荐
- 错误“此流不支持搜索操作"在 C# 中 2022-01-01
- 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01
- 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
- 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
- JSON.NET 中基于属性的类型解析 2022-01-01
- 全局 ASAX - 获取服务器名称 2022-01-01
- 如何动态获取文本框中datagridview列的总和 2022-01-01
- 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01
- 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01
- 首先创建代码,多对多,关联表中的附加字段 2022-01-01
