Какой лучший способ обнаружить 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));
}
Спасибо заранее.
Ответы
Ответ 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));
}
}