Подтвердить что ты не робот

Какой лучший способ обнаружить JSON-запрос на ASP.NET?

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

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

Request.IsAjaxRequest()

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

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

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

Спасибо заранее.

4b9b3361

Ответ 1

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

Затем выполните проверку в действии.

или

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

Ответ 2

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

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

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

Ответ 3

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

Это мой код:

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

--- UPDATE ---

Foollowing предложение @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

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

Request.ContentType 

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

Ответ 5

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

Request.IsAjaxRequest()

Итак, вы можете проверить

if (Request.IsAjaxRequest())
{
   return new JsonResult();
}
return ActionResult

Ответ 6

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

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