Как я могу установить contentType сообщения jQuery ajax, чтобы ASP.NET MVC мог его прочитать?

У меня есть jQuery, который выглядит так:

$.ajax({
     type: "POST",
     url: "/Customer/CancelSubscription/<%= Model.Customer.Id %>",
     contentType: "application/json",
     success: refreshTransactions,
     error: function(xhr, ajaxOptions, thrownError) {
         alert("Failed to cancel subscription! Message:" + xhr.statusText);
     }
});

Если вызываемое действие вызывает исключение, оно в конечном итоге будет воспринято с помощью приложения Global.asax Application_Error, где у меня есть такой код:

var ex = Server.GetLastError();
if (Request.ContentType.Contains("application/json"))
{
     Response.StatusCode = 500;
     Response.StatusDescription = ex.Message;
     Response.TrySkipIisCustomErrors = true;
}
else
{
     // some other way of handling errors ...
}

Когда я выполняю script, который делает запись, Request.ContentType всегда является пустой строкой и поэтому не попадает в первый блок if. Есть ли какая-то другая ценность, которую я должен помещать в ajax "contentType"? Или есть ли другой способ сообщить asp.net, что тип содержимого должен быть "application/json"?

Разъяснение

Цель, которую я пытаюсь достичь, - передать сообщение об ошибке обратно в событие ошибки ajax. В настоящее время, несмотря на то, что блок IF блокируется, событие ошибки корректно выдает окно предупреждения, но сообщение "Не найдено".

Как вы можете видеть, я пытаюсь установить сообщение exeception в Response.StatusDescription, которое, как мне кажется, имеет значение xhr.statusText в ошибке ajax.

Ответы

Ответ 1

В соответствии с этой статьей: http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/ "jQuery неправильно задает указанный тип содержимого, когда нет данных."

$.ajax({
  type: "POST",
  contentType: "application/json; charset=utf-8",
  url: "WebService.asmx/WebMethodName",
  data: "{}",
  dataType: "json"
});

Ответ 2

Чтобы настроить пользовательские заголовки в XmlHTTPRequest, вам нужно использовать функцию опции beforeSend() в вызове JQuery AJAX. Используйте эту функцию для установки дополнительных заголовков, как описано в jQuery API documenation.

Пример:

  $.ajax({
    type: "POST",
    url: "/Customer/CancelSubscription/<%= Model.Customer.Id %>",
    beforeSend: function(xhr) {
      xhr.setRequestHeader( "Content-type", "application/json" );
    },
    success: refreshTransactions,
    error: function(xhr, ajaxOptions, thrownError) {
       alert("Failed to cancel subscription! Message:" + xhr.statusText);
    }
  });

Ответ 3

Если вы всегда возвращаете json для ошибок Ajax, вы можете просто использовать следующее, чтобы обнаружить, что это вызов Ajax:

// jQuery sets a header of 'x-requested-with' in all requests
            string[] ajaxHeader = httpRequest.Headers.GetValues("x-requested-with");
            if (ajaxHeader != null && ajaxHeader.Length > 0)
            {
                return ajaxHeader[0].Equals("XMLHttpRequest", StringComparison.InvariantCultureIgnoreCase);
            }
            return false;

Ответ 4

Используйте этот тип содержимого по умолчанию.

$. AjaxSetup ({       contentType: "application/json; charset = utf-8",     });