¿Cómo puedo configurar el tipo de contenido de una publicación de jQuery ajax para que ASP.NET MVC pueda leerlo?

Tengo algunos jQuery que se parece a esto:

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

Si la acción que se llama provoca una excepción, finalmente será recogida por Global.asax Application_Error donde tengo un código como el siguiente:

 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 ... } 

Cuando ejecuto el script que hace la publicación, el Request.ContentType siempre es una cadena vacía y, por lo tanto, no golpea el primer bloque if. ¿Hay algún otro valor que debería poner en el ajax “contentType”? ¿O hay otra manera de decirle a asp.net que el tipo de contenido debería ser “application / json”?

Aclaración

El objective que estoy tratando de lograr es pasar el mensaje de excepción al evento de error ajax. Actualmente, a pesar de que el bloque IF se está omitiendo, el evento de error arroja correctamente un cuadro de alerta pero el mensaje es “No encontrado”.

Como puede ver, estoy tratando de establecer el mensaje de execepción en el Response.StatusDescription que creo que xhr.statusText en el error ajax se establece en.

De acuerdo con este artículo: http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/ “jQuery no establece correctamente el tipo de contenido especificado cuando no hay datos incluidos. ”

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

Para configurar encabezados personalizados en la solicitud de XmlHTTP, debe utilizar la función de opción beforeSend () en la llamada jQuery AJAX. Use esa función para establecer encabezados adicionales, como se describe en la documentación de la API de jQuery .

Ejemplo:

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

Si siempre está devolviendo json para errores de Ajax, entonces puede usar lo siguiente para detectar que se trata de una llamada de 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; 

Utilice esto para el tipo de contenido predeterminado.

$ .ajaxSetup ({contentType: “application / json; charset = utf-8”,});