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.StatusCode
와 Microsoft.AspNetCore.Http.StatusCodes
당신이 하드 코드의 특정 번호를하지 않으려면, 당신의 응답을 형성한다.
return StatusCode(StatusCodes.Status500InternalServerError);
업데이트 : 2019 년 8 월
아마도 원래 질문과 직접 관련이 없지만 동일한 결과를 얻으려고 할 때 어셈블리 에서 발견 된 Microsoft Azure Functions
새 StatusCodeResult
객체 를 만들어야한다는 것을 알았습니다 Microsoft.AspNetCore.Mvc.Core
. 내 코드는 이제 다음과 같습니다.
return new StatusCodeResult(StatusCodes.Status500InternalServerError);
답변
응답에 신체가 필요한 경우 전화를 걸 수 있습니다.
return StatusCode(StatusCodes.Status500InternalServerError, responseObject);
이것은 응답 객체와 함께 500을 반환합니다 …
답변
더 좋은 방법이 현재로서는이 문제를 처리하기 위해 (1.1)에서이 작업을 수행하는 것입니다 Startup.cs
의 Configure()
:
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 ()로 반환하는 데 사용합니다.