почему возврат JSONResult из переопределенного метода Json не работает, а ContentResult работает?

Недавно я обнаружил странный сценарий, пытаясь переопределить метод Json класса Controller, чтобы я мог использовать преобразователь контрактов JSON.net. Он отлично работает, если в конце я возвращаю объект ContentResult и передаю его в ActionResult. Однако это не сработает, если я попытаюсь вернуть объект JSONResult.

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;
    }

Есть ли какое-то объяснение этому?


person Hem Acharya    schedule 30.01.2017    source источник
comment
Почему нет? Что случается?   -  person SLaks    schedule 30.01.2017


Ответы (2)


Ваш переопределенный метод Json должен возвращать JsonResult.

Вы можете сделать это с ContentResult, потому что они оба наследуются от класса ActionResult.

Если вы хотите, чтобы это работало в любом случае, вы можете вернуть ActionResult из своего переопределения. Но есть еще одна проблема — все методы вашего контроллера, которые будут использовать этот метод, также должны возвращать ActionResult.

Это может быть не большой проблемой, но если вы хотите, чтобы ваш код был чистым, вы должны реализовать свою логику как ActionFilterAttribute и зарегистрировать ее в FilterConfig для глобального использования.

person teo van kot    schedule 30.01.2017
comment
Я понимаю, почему это работает с ContentResult, но я совершенно не понимаю, почему это не работает, когда я использую JsonResult. Когда я возвращаю объект JsonResult, это то, что я получаю. Этот запрос был заблокирован, поскольку конфиденциальная информация может быть раскрыта сторонним веб-сайтам, когда она используется в запросе GET. Чтобы разрешить запросы GET, задайте для JsonRequestBehavior значение AllowGet. Это то, что мы получаем, когда пытаемся вызвать метод Json по умолчанию без указания AllowGet. - person Hem Acharya; 30.01.2017
comment
@HemAcharya, так что ты хочешь? разрешитьПолучить всегда? - person teo van kot; 30.01.2017
comment
Я не хочу всегда разрешать получение. Но даже если я явно передаю JsonRequestBehaviour.AllowGet, возвращая объект JSONResult из переопределенного метода, я получаю упомянутую ошибку. - person Hem Acharya; 30.01.2017

Используете ли вы JsonRequestBehavior. AllowGet при использовании JsonResult в качестве возвращаемого типа?

person ilya korover    schedule 30.01.2017
comment
да. Я использую JsonRequestBehavior.AllowGet. Но даже при этом, если я возвращаю объект результата JSON из перегруженного метода, он в основном выдает ту же ошибку, если бы я обычно вызывал метод Json (без перегрузки) без передачи AllowGet. - person Hem Acharya; 30.01.2017