ASP.NET 7에서 두 개 이상의 Path 기준 라우트하기. Path 기반 라우팅의 주의점.
Routing
ASP.NET 7을 사용해 API 프로젝트를 개발 중인데, OAuth를 처리하기 위해 Path의 두 부분이 동적으로 변하는 URL에 대해 라우팅이 필요해졌다. 예를 들어 다음과 같다.
/api/auth/signin/google
/api/auth/signout/google
/api/auth/signin/naver
/api/auth/signout/naver
...
공식 문서에 따라 다음과 같이 라우트하려 했지만 404 에러가 발생했다.
[AllowAnonymous]
[HttpPost("{action}/{provider}")]
pubilc IActionResult HandleAuthRequest(string action, string provider)
{
// ...
}
하지만 다음과 같이 하니 작동하더라.
[AllowAnonymous]
[HttpPost]
[Route("signin/{provider}")]
[Route("signout/{provider}")]
public IActionResult HandleAuthRequest(string provider)
{
var isSignIn = Request.Path.Value?.Contains("signin") == true;
// ...
}
문서는 항상 꼼꼼히 읽자
하지만 뭔가 이상했다. 구글링을 하는 동안 {param1}/{param2}
가 불가능하고 무조건 Path 라우트 패러미터는 한 개여야만 한다는 글을 본 적이 없다는 것이 걸렸다.
그리고 가만히 생각해보니, 이 문제를 해결하고자 찾아보던 여러 페이지 중 MSDN 공식 문서에 MapControllerRoute
관련 내용이 떠올랐다.
대충 다음과 같은 형식의 코드를 포함하는 내용이었는데
app.MapControllerRoute("oauth",
@"api/auth/{actionType=signin}/{provider=google}",
new { controller = "Auth", action = "HandleAuthRequest", }
);
가만 보니 여기에 action
이 있었다. 즉 {action}/{provider}
에서 {action}
부분이 문제가 된 것 같다는 느낌.
아니나 다를까 다음과 같이 수정하니 정상 작동한다.
[AllowAnonymous]
[HttpPost("{actionType}/{provider}")]
public IActionResult HandleAuthRequest(string actionType,
string provider,
string? callbackUrl = null)
댓글
댓글 쓰기