作为我们项目中的约定,我们将所有API控制器类都命名为AuthenticationApiController
,而不是MVC AuthenticationController
中的控制器。
但是现在调用API时,我们必须像/api/authenticationapi/logout
那样调用它。
应该没问题,但是我不喜欢URL中出现两次“ api”字样。
有没有办法,我可以自定义定义为[Route("api/[controller]")]
的路由,以便在将URL添加到路由表时从控制器名称中删除api。
**注意:寻找通用方法,而不是在每个api控制器上硬编码名称。
答案 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
,它将成功进入动作