2017-02-01 2 views
1

다음과 같이 ASP.NET 핵심 응용 프로그램에 API 컨트롤러가 있습니다.ASP.NET 코어의 잘못된 API URL

[Route("api")] 
public class UserController : Controller 
{ 
    [HttpGet("{userName}/product_info")] 
    public IActionResult GetProductInfo(string userName) 
    { 
     List<ProductInfo> productInfos = _repo.GetProductInfoByUserName(userName); 
     if (productInfos.Count > 0) 
      return Ok(productInfos); 
     else 
      return BadRequest("Unable to process requrest"); 
    } 
} 

나는 /api/{username}/product_info을 사용하여 API를 호출 할 수 있습니다. 사용자가 잘못된 URL을 입력하면 UseStatusCodePagesWithRedirects()을 사용하여 404 페이지로 리디렉션하고 있습니다. 여기의 문제는 내가 /api/{username}/product_o 같은 잘못된 API URL을 사용할 때입니다. 404 페이지로 리다이렉트하여 200의 상태 코드를 반환합니다.이 API를 angular.js와 함께 사용하고 있습니다. API가 상태 코드 200의 잘못된 URL에 404 페이지를 반환하기 때문에 then 메서드의 오류 함수는 $http이 호출되지 않으며 response.data에 404 페이지의 HTML이 표시됩니다. 잘못된 API URL이 호출되면 404 상태 코드를 반환하고 잘못된 NON API URL을 호출하면 정상 404 페이지를 반환합니까? 다음은 잘못된 API URL을 호출 할 때 얻는 내용을 보여주는 스크린 샷입니다. enter image description here

this linkstartup.cs 작품의 configure 방법에 참여 다음 추가에 @Daboul 제안과 솔루션을 기반으로.

Func<HttpContext, bool> isApiRequest = (HttpContext context) => context.Request.Path.ToString().Contains("/api/"); 
app.UseWhen(context => !isApiRequest(context), appBuilder => 
{ 
    appBuilder.UseStatusCodePagesWithRedirects("~/Error/{0}"); 
}); 

답변

1

나는 UseStatusCodePages() 또는 UseStatusCodePagesWithRedirects()와 같은 미들웨어를 사용하여, 당신은 실제로 (브라우저에 코드 200를 보낼 필요) 오류 코드를 포함하는 적절한 HTML 페이지를 반환하는 대신하기로 결정 있다고 생각 코드 자체를 반환합니다. 일반적으로 보안 측면에서는 우수 사례로 간주됩니다. 당신이 겪고있는 것은 내게 논리적 인 것처럼 보입니다. 어쩌면, 당신의 경우에 도움이 될지 모르겠지만, UseStateCodePagesWithRedirects()의 사용을 UseWhen()를 사용하는 모든 컨트롤러가 아닌 모든 컨트롤러로 제한하여이 특정 "/ api/"컨트롤러는 여전히 404를 반환합니까? 또는 각도에 따라 답을 분석하여 오류가 발생했는지 감지하십시오.

+0

나는 angular.js에 익숙하지 않아서 자바 스크립트 측면에서 많은 것을 할 수 없다. ASP.NET 측에서 StatusCodePages를 사용하여 API 컨트롤러를 제외시키기 위해 어떤 종류의 미들웨어를 사용해야합니까? 이 문제는 API 컨트롤러에'Authorize' 속성을 추가 할 때도 발생합니다. 로그인하지 않고 API에 접근하려고 할 때'Authorize' 속성을 추가 한 후 200 개의 상태 코드를 가진 로그인 페이지를 반환합니다. 이 때문에'Authorize' 속성을 제거해야했습니다. –

+0

UseWhen()이 작업을 수행합니다. 예를 들어 여기에서 예제를 찾을 수 있습니다 : http://stackoverflow.com/questions/37841270/branching-asp-net-core-pipeline-authentication UseWhen()를 URL의 조건과 함께 사용하면 context.Request.Path .StartsWithSegments ("/ API /")' – Daboul

+0

Update1 버전에서 'app.UseWhen (context =>! isApiRequest (context), appBuilder => { app.UseStatusCodePagesWithRedirects ("~/Error/{0}"); (~/Error/{0} ") ;; });'switch app for ')';은 다음과 같이 변경해야합니다 : app.UseWhen (context =>! isApiRequest (context), appBuilder => { appBuilder.UseStatusCodePagesWithRedirects appbuilder. – Daboul