J'ai quelques jQuery qui ressemble à ceci:
$.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);
}
});
Si l'action appelée provoque une exception, elle sera finalement capturée par le fichier Global.asax Application_Error où j'ai du code comme celui-ci:
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 ...
}
Lorsque j'exécute le script qui effectue la publication, Request.ContentType est toujours une chaîne vide et ne frappe donc pas le premier bloc if. Existe-t-il une autre valeur que je devrais mettre dans le "contentType" ajax? Ou y a-t-il un autre moyen pour moi de dire à asp.net que le type de contenu doit être "application/json"?
Clarification
Le but que j'essaie d'atteindre est de renvoyer le message d'exception à l'événement d'erreur ajax. Actuellement, même si le bloc IF est en train d'être contourné, l'événement d'erreur renvoie correctement une boîte d'alerte, mais le message est "Introuvable".
Comme vous pouvez le constater, j'essaie de définir le message d'exception sur Response.StatusDescription, auquel le xhr.statusText de l'erreur ajax est défini, selon moi.
Selon cet article: http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/ "jQuery ne définit pas correctement le type de contenu spécifié quand il n'y a pas de données incluses. "
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "WebService.asmx/WebMethodName",
data: "{}",
dataType: "json"
});
Pour définir des en-têtes personnalisés dans XmlHTTPRequest, vous devez utiliser la fonction d'option beforeSend () dans l'appel jQuery AJAX. Utilisez cette fonction pour définir des en-têtes supplémentaires, comme décrit dans la documentation de l'API jQuery.
Exemple:
$.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 vous retournez toujours JSON pour les erreurs Ajax, vous pouvez simplement utiliser ce qui suit pour détecter qu'il s'agit d'un appel 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;
Utilisez ceci pour le type de contenu par défaut.
$ .ajaxSetup ({ contentType: "application/json; charset = utf-8", });