J'essaie d'apprendre AJAX pour ce projet au travail. J'ai un site qui charge des médicaments qu'un patient prend.
J'appelle cette fonction AJAX de manière récursive afin d'ajouter un nouveau tableau contenant un seul médicament et 7 jours d'histoire. J'ai des problèmes pour obtenir le code à exécuter dans FF et IE. Fonctionne parfaitement bien en chrome. J'ai eu des alertes affichant le xmlhttp.status et voici ce que j'ai obtenu:
xmlhttp.status == 500 (erreur interne du serveur ).
J'ai commenté toute ma récursivité afin qu'elle soit réduite à ce peu de code. (x garde une trace du nombre de médicaments pour que je sache quand arrêter)
function LoadMeds()
if ( x == MaxMedCount )
{
document.getElementById("the_day").value = parseInt(document.getElementById("the_day").value)+7;
}
if ( x == (MaxMedCount - 1) )
{
document.getElementById("x").value = x + 1;
show();
}
else
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
try
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
var div = document.createElement('div');
div.innerHTML= xmlhttp.responseText;
document.getElementById('MedTable').appendChild(div);
document.getElementById("the_med_").value = the_med_;
}
}
catch(e)
{
alert("Error");
}
}
xmlhttp.open("GET","URL with variables passed",true);
xmlhttp.send();
document.getElementById("x").value = x + 1;
}
si plus de code est nécessaire, faites le moi savoir.
500 (internal server error)
signifie que quelque chose s'est mal passé du côté du serveur. Il pourrait y avoir plusieurs choses, mais je commencerais par vérifier que l'URL et les paramètres sont corrects. Assurez-vous également que tout ce qui gère la demande l'attend en tant qu'objet GET et non comme POST.
Un moyen utile d'en savoir plus sur ce qui se passe est d'utiliser un outil tel que Fiddler qui vous permettra de consulter toutes les demandes et réponses HTTP afin que vous puissiez voir exactement ce que vous envoyez et le serveur répond.
Si vous n'avez pas de raison impérieuse d'écrire votre propre code Ajax, vous feriez bien mieux d'utiliser une bibliothèque qui gère les interactions Ajax pour vous. jQuery est une option.
Je pense que vos données de chaîne de retour sont très longues. le format JSON a donc été corrompu . Vous devez modifier la taille maximale des données JSON de la manière suivante:
Ouvrez le fichier Web.Config et collez ces lignes dans la section de configuration.
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="50000000"/>
</webServices>
</scripting>
</system.web.extensions>
Ce paramètre peut être incorrect pour votre appel SOAP; Examinez le format du ou des paramètres dans la section "data:" json - il s’agit de la charge utile que vous transmettez au paramètre et aux données encapsulées au format JSON.
La barre d’outils de débogage de Google Chrome contient de bons outils pour vérifier les paramètres et consulter les messages d’erreur, par exemple, commencez par l’onglet Console et cliquez sur l’URL concernée ou cliquez sur l’onglet Réseau. Vous voudrez voir les en-têtes du message, la réponse etc ...
Décommentez la ligne suivante: [System.Web.Script.Services.ScriptService]
Le service va commencer à bien fonctionner.
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
Pour autoriser l'appel de ce service Web à partir d'un script, à l'aide d'ASP.NET AJAX, décommentez la ligne suivante.
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService
{
Si le même problème se posait, je me suis rappelé que pour des raisons de sécurité ASP n’expose pas la totalité de l’erreur ou de la trace de la pile lorsqu’il accède à votre site/service à distance, de même que ne pas pouvoir tester un service Web .asmx
à distance , j’ai donc intégré le serveur à distance et surveillé mes outils de développement, et ce n’est qu’alors que le message notoire "Impossible de charger le fichier ou l’assembly 'Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'
ou l’un de ses dep ...".
Alors connectez-vous sur le serveur et déboguez à partir de là.
On doit utiliser behavior: JsonRequestBehavior.AllowGet
dans Post Json Return
en C #
J'ai corrigé une erreur comme celle-ci en changeant l'emplacement des routes dans routes.php, par exemple j'avais quelque chose comme ça:
Route::resource('Mensajes', 'MensajeriaController');
Route::get('Mensajes/modificar', 'MensajeriaController@modificarEstado');
et puis je le mets comme ceci:
Route::get('Mensajes/modificar', 'MensajeriaController@modificarEstado');
Route::resource('Mensajes', 'MensajeriaController');
J'ai eu la même erreur. Il s’avère que la cause en était que la méthode d’arrière-plan attendait différentes données JSON. Dans mon appel à l'Ajax, j'avais quelque chose comme ça:
$.ajax({
async: false,
type: "POST",
url: "http://13.82.13.196/api.aspx/PostAjax",
data: '{"url":"test"}',
contentType: "application/json; charset=utf-8",
dataType: "json",
});
Maintenant, dans mon WebMethod, à l'intérieur de mon code backend C #, j'avais déclaré mon terminal comme suit:
public static string PostAjax(AjaxSettings settings)
Où AjaxSettings a été déclaré:
public class AjaxSettings
{
public string url { get; set; }
}
Le problème était alors que le mappage entre mon appel ajax et mon point d'extrémité dorsal n'était pas le même. Dès que j'ai changé mon appel ajax au suivant, tout a bien fonctionné!
var data ='{"url":"test"}';
$.ajax({
async: false,
type: "POST",
url: "http://13.82.13.196/api.aspx/PostAjax",
data: '{"settings":'+data+'}',
contentType: "application/json; charset=utf-8",
dataType: "json"
});
Je devais changer la variable de données à l'intérieur de l'appel Ajax afin de correspondre exactement à la signature de la méthode.