2017-01-30 16 views
1

최근 JSON.net 계약 해법을 사용할 수 있도록 Controller 클래스의 Json 메서드를 재정의하려는 중 이상한 시나리오를 발견했습니다. 결국 ContentResult 객체를 반환하고 ActionResult로 업 캐스트하면 완벽하게 작동합니다. JSONResult 객체를 반환하려고하면 작동하지 않습니다.재정의 된 Json 메서드에서 JSONResult를 반환하는 것이 작동하지 않고 ContentResult가 작동하는 이유는 무엇입니까?

protected new ContentResult Json(object data, JsonRequestBehavior behaviour = JsonRequestBehavior.DenyGet) 
    { 
     var jsonSerializerSettings = new JsonSerializerSettings 
     { 
      ContractResolver = new CamelCasePropertyNamesContractResolver() 
     }; 

     if (Request.RequestType == WebRequestMethods.Http.Get && behaviour == JsonRequestBehavior.DenyGet) 
     { 
      throw new InvalidOperationException("GET is not permitted for this request"); 
     } 

     var jsonResult = new ContentResult 
     { 
      Content = JsonConvert.SerializeObject(data, jsonSerializerSettings), 
      ContentType = "application/json", 
     }; 

     return jsonResult; 
    } 

설명이 있습니까?

+0

왜 안 되니? 무슨 일이야? – SLaks

답변

1

재정의 된 Json 메서드는 JsonResult을 반환해야합니다.

둘 다 ActionResult 클래스를 상속하므로 ContentResult으로 처리 할 수 ​​있습니다.

어쨌든이 작업을 원할 경우 - 재정의에서 ActionResult을 반환 할 수 있습니다. 그러나 또 다른 문제가 있습니다.이 메서드를 사용할 모든 컨트롤러 메서드는 ActionResult을 반환해야합니다.

큰 문제는 아니지만 코드를 깨끗하게 유지하려면 로직을 ActionFilterAttribute으로 구현하고 전체 사용을 위해 FilterConfig에 등록해야합니다.

+0

ContentResult와 함께 작동하는 이유를 이해하지만 JsonResult를 사용할 때 왜 작동하지 않는지 전혀 알지 못합니다. JsonResult 객체를 반환하면 이것이 나옵니다. GET 요청을 허용하려면 JsonRequestBehavior를 AllowGet으로 설정하십시오. "라는 메시지가 표시되어"이 요청은 타사 웹 사이트에 민감한 정보가 공개 될 수 있기 때문에 차단되었습니다. 이것은 AllowGet을 지정하지 않고 기본 Json 메서드를 호출 할 때 얻을 수있는 것입니다. –

+0

@HemAcharya 그래서 무엇을 원하니? 항상 allowGet? –

+0

나는 항상 allowGet을 원하지 않는다. 하지만 재정의 된 메서드에서 JSONResult 개체를 반환하는 동안 명시 적으로 JsonRequestBehaviour.AllowGet을 전달하더라도 내가 언급 한 오류가 발생합니다. –

0

반환 유형으로 JsonResult를 사용하는 동안 JsonRequestBehavior.AllowGet을 사용합니까?

+0

예. JsonRequestBehavior.AllowGet을 사용합니다. 하지만 JSON 결과 객체를 오버로드 된 메서드에서 반환하는 경우에도 AllowGet을 전달하지 않고 Json 메서드 (오버로드하지 않고)를 호출하면 기본적으로 동일한 오류가 발생합니다. –