ASP.NET 7에서 두 개 이상의 Path 기준 라우트하기. Path 기반 라우팅의 주의점.

Welcome file

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)

댓글

이 블로그의 인기 게시물

C# 남아도는 메모리에도 불구하고 OutOfMemoryException이 발생한다면?

USB를 뒤는 괜찮은데 앞에 꽂으면 인식이 힘들다?

MySQL 데이터 타입과 Java 데이터 타입 비교/매칭