Как лучше всего обнаружить запрос JSON в ASP.NET? - PullRequest
20 голосов
/ 03 июня 2011

Большинство фреймворков ajax, похоже, стандартизируются с помощью X-Request-With в заголовке или строке запроса.

А в ASP.NET MVC вы можете использовать метод расширения

Request.IsAjaxRequest()

Поскольку ajax-клиент может запрашивать несколько различных типов контента, а не только «application / json», например: «application / xml».

Я использую следующий фрагмент кода / метод расширения, но мне бы очень хотелось посмотреть, что делают другие, или что-то пропустил, или лучше.

public static bool IsJsonRequest(this HttpRequestBase request)
{
    return request.Headers["Accept"].Split(',') 
       .Any(t => t.Equals("application/json", StringComparison.OrdinalIgnoreCase));
}

Заранее спасибо.

Ответы [ 6 ]

21 голосов
/ 09 апреля 2013

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

Не используйте заголовок type type запроса - это указывает на тип тела запрос сообщение.Обязательно установите для него значение «application / json», если вы выполняете POST или PUTting какой-то Json на сервер, но если вы делаете запрос GET, тогда тип содержимого должен быть пустым (поскольку тело запроса GET пусто)и если вы публикуете форму, состоящую из нескольких частей или что-то еще, она должна отражать этот тип.

Поведение для форм в Интернете заключается в том, чтобы задать тип содержимого запроса «multipart / form-data» и тип принятия «text / html».В Интернете перегрузка сервера таким образом, что он возвращает тот же тип, что и тип содержимого запроса, при этом игнорируя заголовок типа принятия, будет означать, что отправленные формы возвращают закодированные данные формы, а не HTML-страницу.Очевидно, это неправильное поведение, поэтому не создавайте свои приложения на основе такой интерпретации типа содержимого запроса.

4 голосов
/ 10 января 2014

Я нашел ответ Пита Киркхама очень полезным.И я думаю, что это должно быть помечено как решение.

Это мой код в соответствии с ним:

/// <summary>
/// Determines whether the request is a Json Request
/// </summary>
public static bool GetIsJsonRequest(HttpRequest request)
{
    if (request == null)
    {
        throw new ArgumentNullException("request");
    }
    bool rtn = false;
    const string jsonMime = "application/json";

    if (request.AcceptTypes!=null)
    {
        rtn = request.AcceptTypes.Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
    }
    return rtn || request.ContentType.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
}

--- ОБНОВЛЕНИЕ ---

Следуя @Предложение Mvision это версия MVC:

public static bool GetIsJsonRequest(HttpRequestBase request)
{
    if (request == null)
    {
        throw new ArgumentNullException("request");
    }
    bool rtn = false;
    const string jsonMime = "application/json";

    if (request.AcceptTypes!=null)
    {
        rtn = request.AcceptTypes.Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
    }
    return rtn || request.ContentType.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
}

Если вам нужно использовать этот метод как в asp.net classic, так и в MVC, то второй - это рекомендуемый.Чтобы преобразовать HttpRequest в HttpREquestBase, просто оберните его HttpRequestWrapper:

public static bool GetIsJsonRequest(HttpRequest request)
{
    return GetIsJsonRequest(new HttpRequestWrapper(request));
}
4 голосов
/ 09 июня 2011

Почему вы не можете просто передать переменную bool, скажем, IsJsonRequest от клиента, которому вы делаете запрос?

Затем проверьте метод действия.

или

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

1 голос
/ 09 июня 2011

Вы можете использовать

Request.IsAjaxRequest()

Так что вы можете проверить

if (Request.IsAjaxRequest())
{
   return new JsonResult();
}
return ActionResult
0 голосов
/ 20 ноября 2015

Надеюсь, это будет намного эффективнее

public static class JsonResultController
{
    public static bool IsJsonRequest(this HttpRequestBase request)
    {
        return GetIsJsonRequest(request);
    }

    public static bool IsJsonRequest(this HttpRequest request)
    {
        return GetIsJsonRequest(request);
    }

    private static bool GetIsJsonRequest(dynamic request)
    {
        if (request == null)
        {
            throw new ArgumentNullException("request");
        }
        bool rtn = false;
        const string jsonMime = "application/json";

        if (request.AcceptTypes != null)
        {
            rtn = (request.AcceptTypes as string[]).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
        }
        return rtn || (request.ContentType as string ?? "").Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
    }
}
0 голосов
/ 03 июня 2011

Вы можете использовать

Request.ContentType 

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

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