>

. .NET Core Web API 컨트롤러에서 HTTP 상태 코드를 사용하여 JSON을 반환하는 올바른 방법을 찾고 있습니다. 나는 이것을 다음과 같이 사용합니다 :

public IHttpActionResult GetResourceData()
{
    return this.Content(HttpStatusCode.OK, new { response = "Hello"});
}

이것은 4.6 MVC 응용 프로그램에 있었지만 지금은 .NET Core 에서이 IHttpActionResult 가없는 것 같습니다.  나는 ActionResult  다음과 같이 사용하십시오 :

public ActionResult IsAuthenticated()
{
    return Ok(Json("123"));
}

그러나 아래 이미지와 같이 서버의 응답이 이상합니다.

웹 API 컨트롤러가 웹 API 2에서와 같이 HTTP 상태 코드로 JSON을 반환하기를 원합니다.


  • 답변 # 1

    JsonResult 로 응답하는 가장 기본적인 버전  입니다 :

    // GET: api/authors
    [HttpGet]
    public JsonResult Get()
    {
        return Json(_authorRepository.List());
    }
    
    

    자신의 응답 코드를 명시 적으로 처리 할 수 ​​없기 때문에 문제가 해결되지 않습니다.

    와이즈 비즈 와이즈 비즈  그런 다음

    The way to get control over the status results, is you need to return a 를 활용할 수있는 곳  유형.

    예 :

    ActionResult
    
    

    위의 두 가지 예는 모두 Microsoft 설명서에서 제공하는 훌륭한 가이드 : 응답 데이터 형식 지정

    에서 가져온 것입니다. <시간> 추가 물건

    내가 자주 접하는 문제는 VS의 "새 프로젝트"템플릿에서 기본 구성을 사용하는 대신 WebAPI를보다 세밀하게 제어하기를 원한다는 것입니다.

    기본 몇 가지를 확인하십시오 ...

    1 단계 : 서비스 구성

    상태 코드를 완전히 제어하면서 ASP.NET Core WebAPI가 JSON Serialized Object로 응답하도록하려면 StatusCodeResult 를 포함시켜야합니다.  당신의 // GET: api/authors/search?namelike=foo [HttpGet("Search")] public IActionResult Search(string namelike) { var result = _authorRepository.GetByNameSubstring(namelike); if (!result.Any()) { return NotFound(namelike); } return Ok(result); } 에서 서비스   AddMvc() 에서 일반적으로 발견되는 방법 .

    와이즈 비즈 와이즈 비즈  다른 요청 유형에 대한 응답과 함께 JSON 용 입력/출력 포맷터가 자동으로 포함됩니다.

    프로젝트에모든 권한이 필요하고 WebAPI가 ConfigureServices 를 포함한 다양한 요청 유형에 어떻게 작동하는지와 같은 서비스를 엄격하게 정의하려는 경우  표준 브라우저 요청과 같은 다른 요청 유형에 응답하지 않으면 다음 코드를 사용하여 수동으로 정의 할 수 있습니다.

    Startup.cs
    
    

    다른 직렬화 형식 (protobuf, thrift 등)에 응답하고 싶을 경우 사용자 지정 입력/출력 포맷터를 추가 할 수있는 방법도 포함되어 있습니다.

    위의 코드 덩어리는 대부분

    It's important to note that 의 복제본입니다.  방법. 그러나 템플릿이 포함 된 사전 배송 된 서비스를 사용하는 대신 각각의 모든 서비스를 정의하여 각 "기본"서비스를 자체적으로 구현하고 있습니다. 코드 블록에 리포지토리 링크를 추가했거나 AddMvc() 를 확인할 수 있습니다  GitHub 리포지토리에서 ..

    처음에 기본값을 구현하지 않고 기본값을 "취소"하여이 문제를 해결하기위한 몇 가지 안내서가 있습니다 ... 지금 Open으로 작업하고 있다고 생각하면 출처, 이것은 중복 작업, 잘못된 코드 및 솔직히 곧 사라질 습관입니다.

    <시간> 2 단계 : 컨트롤러 생성

    질문을 정리하는 간단한 방법을 보여 드리겠습니다.

    application/json
    
    
    <시간> 3 단계 : Wyzwyz 확인그리고 public void ConfigureServices(IServiceCollection services) { // Build a customized MVC implementation, without using the default AddMvc(), instead use AddMvcCore(). // https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs services .AddMvcCore(options => { options.RequireHttpsPermanent = true; // does not affect api requests options.RespectBrowserAcceptHeader = true; // false by default //options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>(); //remove these two below, but added so you know where to place them... options.OutputFormatters.Add(new YourCustomOutputFormatter()); options.InputFormatters.Add(new YourCustomInputFormatter()); }) //.AddApiExplorer() //.AddAuthorization() .AddFormatterMappings() //.AddCacheTagHelper() //.AddDataAnnotations() //.AddCors() .AddJsonFormatters(); // JSON, or you can build your own custom one (above) }

    당신은 당신의 AddMvc() 를 확인해야합니다  그리고 AddMvc()  요청의 헤더가 올바르게 설정되었습니다. 귀하의 경우 (JSON), public class FooController { [HttpPost] public async Task<IActionResult> Create([FromBody] Object item) { if (item == null) return BadRequest(); var newItem = new Object(); // create the object to return if (newItem != null) return Ok(newItem); else return NotFound(); } } 로 설정하고 싶을 것입니다 .

    요청 헤더가 무엇을 지정하든 WebAPI가 기본적으로 JSON으로 응답하도록하려면커플 방식으로 수행 할 수 있습니다.

    1 일차 앞에서 권장 한 기사 (응답 데이터 형식 지정)에 표시된 것처럼 컨트롤러/액션 수준에서 특정 형식을 강제 할 수 있습니다. 개인적으로이 방법이 마음에 들지 않지만 여기서는 완전 함을위한 것입니다 :

    와이즈 비즈 와이즈 비즈      

    와이즈 비즈  필터는   와이즈 비즈  다른 경우에도 JSON 형식의 응답을 반환   응용 프로그램 및 클라이언트에 대해 포맷터가 구성되었습니다.   와이즈 비즈  다른 사용 가능한 형식을 요청하는 헤더

    2 일차 내가 선호하는 방법은 WebAPI가 요청 된 형식으로 모든 요청에 ​​응답하는 것입니다. 그러나 요청 된 형식을 수락하지 않으면대체를 기본 (예 : JSON)으로

    먼저 옵션에 등록해야합니다 (앞서 언급 한대로 기본 동작을 다시 작업해야 함)

    Content-Type
    
    

    마지막으로 서비스 빌더에 정의 된 포맷터 목록의 순서를 다시 정렬하면 웹 호스트는 기본적으로 목록 맨 위에있는 포맷터 (예 : 위치 0)로 설정됩니다.

    자세한 내용은이 .NET 웹 개발 및 도구 블로그 항목을 참조하십시오.

  • 답변 # 2

    가장 일반적인 상태 코드에 대해 미리 정의 된 방법이 있습니다.

    Accept   Content-Type 를 반환  응답과 함께

    Accept   application/json 를 반환  + 새로운 리소스 URL

    Forcing a Particular FormatIf you would like to restrict the response formats for a specific action you can, you can apply the [Produces] filter. The [Produces] filter specifies the response formats for a specific action (or controller). Like most Filters, this can be applied at the action, controller, or global scope.

     
    [Produces("application/json")]
    public class AuthorsController
    를 반환
    

    [Produces]   AuthorsController 를 반환  등

    와이즈 비즈 참조  그리고 Accept  모든 방법의 목록.

    그러나 당신이 정말로 주장한다면 options.RespectBrowserAcceptHeader = true; // false by default 를 사용할 수 있습니다  사용자 정의 코드를 설정하려면 코드를 읽기 어렵게 만들고 헤더를 설정하기 위해 코드를 반복해야하므로 ( Ok(result) 와 같이) ).

    200
    
    

  • 답변 # 3

    ASP.NET Core 2.0을 사용하면 CreatedAtRoute 에서 객체를 반환하는 이상적인 방법(MVC와 통합되고 동일한 기본 클래스 201 를 사용합니다. )는

    NotFound
    
    

    알림

    <올>

    404 와 함께 반환  상태 코드 ( BadRequest 입니다)   400 의 유형 )

    콘텐츠 협상을 수행합니다. 즉, BaseController.cs 를 기반으로 반환됩니다.  요청 헤더. 만약 Controller.cs  요청으로 전송되면 StatusCode 로 반환됩니다. . 아무것도 보내지 않으면 CreatedAtRoute  기본값입니다.

    특정 상태 코드와 함께전송해야하는 경우 public ActionResult IsAuthenticated() { return StatusCode(200, Json("123")); } 를 사용하십시오.  또는 Web API  대신에. 둘 다 동일한 작업을 수행하고 컨텐츠 협상을 지원합니다.

    Controller
    
    

    특히JSON으로 돌아가려면몇 가지 방법이 있습니다

    public IActionResult Get()
    {
        return new OkObjectResult(new Item { Id = 123, Name = "Hero" });
    }
    
    

    알림

    <올>

    와이즈 비츠를 집행하다  서로 다른 두 가지 방법으로

    콘텐츠 협상을 무시합니다.

    첫 번째 방법은 특정 시리얼 라이저 200 OK 로 JSON을 시행합니다. .

    두 번째 방법은 Ok 를 사용하여 동일하게 수행  속성 ( ObjectResult ) ) Accept 와 함께

    공식 문서에서 자세히 알아보세요. 여기에서 필터에 대해 알아보십시오.

    샘플에 사용되는 간단한 모델 클래스

    Accept: application/xml
    
    

  • 답변 # 4

    내가 생각해 낸 가장 쉬운 방법은 :

    XML
    
    

  • 답변 # 5

    이것이 가장 쉬운 해결책입니다 :

    JSON
    
    

    또는

    ObjectResult
    
    
    StatusCode

  • 이전 azure - aadsts70005 - response_type 'id_token'이 애플리케이션에 사용 가능하지 않습니다
  • 다음 Android에서 Fragment의 dispatchTouchEvent