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.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
}
Above snippet taken from Scott Sauber's blog.
return StatusCode((int)HttpStatusCode.InternalServerError, e);
Should be used in non-ASP.NET contexts (see other answers for ASP.NET Core).
HttpStatusCode
is an enumeration in System.Net
.
How about creating a custom ObjectResult class that represents an Internal Server Error like the one for OkObjectResult
? You can put a simple method in your own base class so that you can easily generate the InternalServerError and return it just like you do Ok()
or 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;
}
}
When you want to return a JSON response in MVC .Net Core You can also use:
Response.StatusCode = (int)HttpStatusCode.InternalServerError;//Equals to HTTPResponse 500
return Json(new { responseText = "my error" });
This will return both JSON result and HTTPStatus. I use it for returning results to jQuery.ajax().
참고URL : https://stackoverflow.com/questions/37793418/how-to-return-http-500-from-asp-net-core-rc2-web-api
'Programing' 카테고리의 다른 글
isKindOfClass와 isMemberOfClass의 iOS 차이점 (0) | 2020.06.14 |
---|---|
동일한 div에서 두 버튼 사이에 공백을 어떻게 만들 수 있습니까? (0) | 2020.06.14 |
자바 스크립트를 사용하여 정규 표현식 특수 문자를 이스케이프 처리하는 방법은 무엇입니까? (0) | 2020.06.14 |
Ruby 스크립트를 어떻게 디버깅합니까? (0) | 2020.06.14 |
SSH 세션에서 클라이언트의 IP 주소 찾기 (0) | 2020.06.14 |