Как заставить контроллер / действие использовать JsonValueProvider - PullRequest
2 голосов
/ 27 января 2012

Добрый день!

Я использую ASP.NET MVC 3, где JsonValueProvider является встроенным.

Проблема в том, что он работает, только если указано Content-Type: application/json.

Я создаю API, где JSON является единственным поддерживаемым форматом, и я не хочу заставлять клиентов устанавливать этот заголовок.

Есть ли способ заставить контроллер / действие использовать определенный ValueProvider?

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Несмотря на то, что это работает и очень просто, кажется, что это больше взломать. Что вы можете сделать, это создать атрибут, производный от AuthorizeAttribute, и в OnAuthorization вы зададите для Content-Type значение application / json.

public class JsonActionAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        filterContext.HttpContext.Request.ContentType = "application/json";
    }
}

[JsonAction]
public ActionResult JsonOnlyAction(string var1, int var2, ...)
{
    ...
}

Этот атрибут также можно применять на уровне контроллера.

Первоначально я пытался установить тип содержимого в фильтре действий, но проблема в OnActionExecuting возникает после выбора поставщиков значения, поэтому установка типа содержимого происходит слишком поздно.

OnAuthorization происходит до того, как будут выбраны провайдеры значений, и поскольку JsonValueProviderFactory проверяет Request.ContentType.StartsWith("application/json"), это гарантирует, что он выбран.

0 голосов
/ 27 января 2012

Извините, если я неправильно понял вопрос, но разве это не то, что вам нужно сделать:

Response.ContentType = "application/json"

Вы можете создать фильтр / атрибут действий, чтобы избежать повторения этой строки в несколькихдействия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...