ASP.NET Core RC2 웹 API에서 HTTP 500을 반환하는 방법? …

RC1로 돌아가서 다음과 같이합니다.

[HttpPost]
public IActionResult Post([FromBody]string something)
{
    try{
        // ...
    }
    catch(Exception e)
    {
         return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError);
    }
}

RC2에는 더 이상 HttpStatusCodeResult가 없으며 500 유형의 IActionResult를 반환 할 수있는 항목이 없습니다.

내가 요구하는 것과 접근법이 완전히 다른가요? 더 이상 Controller코드를 사용하지 않습니까? 프레임 워크가 일반적인 500 예외를 API 호출자에게 다시 던지도록합니까? 개발을 위해 정확한 예외 스택을 어떻게 볼 수 있습니까?



답변

내가 볼 수 있듯이 ControllerBase클래스 안에 도우미 메서드가 있습니다 . StatusCode방법을 사용하십시오 .

[HttpPost]
public IActionResult Post([FromBody] string something)
{
    //...
    try
    {
        DoSomething();
    }
    catch(Exception e)
    {
         LogException(e);
         return StatusCode(500);
    }
}

StatusCode(int statusCode, object value)콘텐츠를 협상하는 오버로드를 사용할 수도 있습니다 .


답변

당신은 사용할 수 Microsoft.AspNetCore.Mvc.ControllerBase.StatusCodeMicrosoft.AspNetCore.Http.StatusCodes당신이 하드 코드의 특정 번호를하지 않으려면, 당신의 응답을 형성한다.

return  StatusCode(StatusCodes.Status500InternalServerError);

업데이트 : 2019 년 8 월

아마도 원래 질문과 직접 ​​관련이 없지만 동일한 결과를 얻으려고 할 때 어셈블리 에서 발견 된 Microsoft Azure FunctionsStatusCodeResult객체 를 만들어야한다는 것을 알았습니다 Microsoft.AspNetCore.Mvc.Core. 내 코드는 이제 다음과 같습니다.

return new StatusCodeResult(StatusCodes.Status500InternalServerError);

답변

응답에 신체가 필요한 경우 전화를 걸 수 있습니다.

return StatusCode(StatusCodes.Status500InternalServerError, responseObject);

이것은 응답 객체와 함께 500을 반환합니다 …


답변

더 좋은 방법이 현재로서는이 문제를 처리하기 위해 (1.1)에서이 작업을 수행하는 것입니다 Startup.csConfigure():

app.UseExceptionHandler("/Error");

에 대한 경로가 실행됩니다 /Error. 이렇게하면 작성하는 모든 작업에 try-catch 블록을 추가하지 않아도됩니다.

물론 다음과 유사한 ErrorController를 추가해야합니다.

[Route("[controller]")]
public class ErrorController : Controller
{
    [Route("")]
    [AllowAnonymous]
    public IActionResult Get()
    {
        return StatusCode(StatusCodes.Status500InternalServerError);
    }
}

자세한 내용은 여기를 참조 하십시오 .


실제 예외 데이터를 가져 오려면 명령문 Get()바로 앞에 이를 추가 할 수 있습니다 return.

// Get the details of the exception that occurred
var exceptionFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

if (exceptionFeature != null)
{
    // Get which route the exception occurred at
    string routeWhereExceptionOccurred = exceptionFeature.Path;

    // Get the exception that occurred
    Exception exceptionThatOccurred = exceptionFeature.Error;

    // TODO: Do something with the exception
    // Log it with Serilog?
    // Send an e-mail, text, fax, or carrier pidgeon?  Maybe all of the above?
    // Whatever you do, be careful to catch any exceptions, otherwise you'll end up with a blank page and throwing a 500
}

Scott Sauber의 블로그 에서 가져온 스 니펫 위 .


답변

return StatusCode((int)HttpStatusCode.InternalServerError, e);

ASP.NET이 아닌 컨텍스트에서 사용해야합니다 (ASP.NET Core에 대한 다른 답변 참조).

HttpStatusCode의 열거 형입니다 System.Net.


답변

에 대한 것과 같은 내부 서버 오류를 나타내는 사용자 정의 ObjectResult 클래스를 작성하는 방법은 OkObjectResult무엇입니까? 자신의 기본 클래스에 간단한 메소드를 삽입하여 InternalServerError를 쉽게 생성하고 Ok()또는 처럼 수행 할 수 있습니다 BadRequest().

[Route("api/[controller]")]
[ApiController]
public class MyController : MyControllerBase
{
    [HttpGet]
    [Route("{key}")]
    public IActionResult Get(int key)
    {
        try
        {
            //do something that fails
        }
        catch (Exception e)
        {
            LogException(e);
            return InternalServerError();
        }
    }
}

public class MyControllerBase : ControllerBase
{
    public InternalServerErrorObjectResult InternalServerError()
    {
        return new InternalServerErrorObjectResult();
    }

    public InternalServerErrorObjectResult InternalServerError(object value)
    {
        return new InternalServerErrorObjectResult(value);
    }
}

public class InternalServerErrorObjectResult : ObjectResult
{
    public InternalServerErrorObjectResult(object value) : base(value)
    {
        StatusCode = StatusCodes.Status500InternalServerError;
    }

    public InternalServerErrorObjectResult() : this(null)
    {
        StatusCode = StatusCodes.Status500InternalServerError;
    }
}

답변

MVC .Net Core에서 JSON 응답을 반환하려는 경우 다음을 사용할 수도 있습니다.

Response.StatusCode = (int)HttpStatusCode.InternalServerError;//Equals to HTTPResponse 500
return Json(new { responseText = "my error" });

JSON 결과와 HTTPStatus를 모두 반환합니다. 결과를 jQuery.ajax ()로 반환하는 데 사용합니다.