api两次出现在网址“ api / AuthenticationAPI / logout”中

时间:2019-10-16 06:13:18

标签: asp.net-mvc asp.net-core routing

作为我们项目中的约定,我们将所有API控制器类都命名为AuthenticationApiController,而不是MVC AuthenticationController中的控制器。

但是现在调用API时,我们必须像/api/authenticationapi/logout那样调用它。

应该没问题,但是我不喜欢URL中出现两次“ api”字样。

有没有办法,我可以自定义定义为[Route("api/[controller]")]的路由,以便在将URL添加到路由表时从控制器名称中删除api。

**注意:寻找通用方法,而不是在每个api控制器上硬编码名称。

1 个答案:

答案 0 :(得分:1)

尝试使用Url Rewriter并参考我的使用asp.net core 3.0的演示:

1。创建RewriterRules

public class RewriteRules
{
    public static void ReWriteRequests(RewriteContext context)
    {
        var request = context.HttpContext.Request;
        var path = request.Path.Value;

        if (path != null)
        {
            var array = path.Split("/");
            if (array[1] == "api" && !array[2].EndsWith("api", StringComparison.OrdinalIgnoreCase))
            {
                array[2] = array[2] + "api";
                var newPath = String.Join("/", array);
                context.HttpContext.Request.Path = newPath;

            }
        }

    }
}

2。在启动Configure方法中进行注册(如果使用核心2.2,请在app.UseMvc()之前)

app.UseRewriter(new RewriteOptions()
            .Add(RewriteRules.ReWriteRequests)
            );
app.UseRouting();         
app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });

3.Test

[Route("api/[controller]")]
[ApiController]
public class AuthenticationApiController : ControllerBase
{
    // GET: api/TestApi
    [HttpGet("logout")]
    public IEnumerable<string> logout()
    {
        return new string[] { "value1", "value2" };
    }
 }

调用/api/authentication/logout,它将成功进入动作

相关问题