下午好,
我在使用属性路由和ASP.NET核心路由中间件的Web API中遇到了端点路由方面的麻烦。
我有一个大致如下的API控制器:
public class UsersController : ControllerBase
{
[HttpGet]
[Route("v1/users/{id}", Name = nameof(GetUser), Order = 1)]
public async Task<ActionResult> GetUser([FromQuery(Name = "id")] string userGuid)
{
// Implementation omitted.
}
[HttpGet]
[Route("v1/users/me", Name = nameof(GetCurrentUser), Order = 0)]
public async Task<ActionResult> GetCurrentUser()
{
// Implementation omitted.
}
}
我正在尝试配置端点路由,以便将对'v1 / users / me'的请求路由至'GetCurrentUser()'方法,而与模板'v1 / users / {id}'匹配的请求(其中{id}! = me)路由到'GetUser()'方法。我希望可以通过将“ v1 / users / me”端点按端点顺序放置在另一个端点之前来解决此问题,但是路由中间件似乎不遵守order参数。我还尝试过在映射其余端点之前显式映射'v1 / users / me'端点,但这似乎也不起作用。
这是当前的启动配置:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseResponseCompression();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
// Explicit mapping of the GetCurrentUser endpoint - doesn't seem to do anything.
// endpoints.MapControllerRoute("v1/users/me", "Users/GetCurrentUser");
endpoints.MapControllers();
}
}
使用属性路由可以实现这一点吗?如果可以,我缺少什么?
谢谢!
问题出在API端点方法的注释上。
我用[FromQuery]属性而不是[FromRoute]属性在GetUser(string id)端点中错误地标记了该参数。
预期的工作如下:
public class UsersController : ControllerBase
{
[HttpGet]
[Route("v1/users/{id}", Name = nameof(GetUser))]
public async Task<ActionResult> GetUser([FromRoute(Name = "id")] string userGuid)
{
// Changed from [FromQuery(Name = "id")] to [FromRoute(Name = "id")]
// Implementation omitted.
}
[HttpGet]
[Route("v1/users/me", Name = nameof(GetCurrentUser))]
public async Task<ActionResult> GetCurrentUser()
{
// Implementation omitted.
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句