web-dev-qa-db-fra.com

JQuery Ajax Post génère 500 erreurs de serveur internes

J'essaie de réaliser cette publication AJAX mais, pour une raison quelconque, le serveur 500 affiche une erreur. Je peux le voir atteindre des points de rupture dans le contrôleur. Donc, le problème semble être sur le rappel. N'importe qui?

$.ajax({
    type: "POST",
    url: "InlineNotes/Note.ashx?id=" + noteid,
    data: "{}",
    dataType: "json",

    success: function(data) {
        alert(data[1]);
    },
    error: function(data){
        alert("fail");
    }
});

C'est la chaîne qui devrait être retournée:

{status:'200', text: 'Something'}
67
Nick

Je soupçonne que la méthode du serveur génère une exception après avoir dépassé votre point d'arrêt. Utilisez Firefox/Firebug ou les outils de développement IE8 pour examiner la réponse réelle que vous obtenez du serveur. S'il y a eu une exception, vous obtiendrez le html YSOD, qui devrait vous aider à déterminer où chercher.

Une dernière chose - votre propriété data devrait être {} et non "{}", le premier est un objet vide, tandis que le dernier est une chaîne non valide en tant que paramètre de requête. Mieux encore, laissez-le de côté si vous ne transmettez aucune donnée.

64
tvanfosson

si quelqu'un utilise le framework codeigniter, le problème peut être causé par la configuration de la protection csrf activée.

29
v1r00z

Je viens d'avoir ce problème moi-même, même si je ne pouvais pas trouver la raison dans mon cas, en passant de POST à GET, l'erreur 500 problème a disparu!

 type:'POST'
17
Stian

Ceci est une demande Ajax Un code simple pour récupérer des données via une demande Ajax

$.ajax({
    type: "POST",
    url: "InlineNotes/Note.ashx",
    data: '{"id":"' + noteid+'"}',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data) {
        alert(data.d);
    },
    error: function(data){
        alert("fail");
    }
});
15
BTE

Vous pouvez rechercher les codes de statut HTTP ici (ou ici ), cette erreur vous indique:

"Le serveur a rencontré une condition inattendue qui l’empêchait de répondre à la demande."

Vous devez déboguer votre serveur.

9
Tom

Je rencontre la même chose aujourd'hui. Comme suggéré précédemment, obtenez Firebug pour Firefox, activez la console et prévisualisez la réponse POST. Cela m'a aidé à découvrir à quel point le problème était stupide. Mon action attendait la valeur d'un type int et je postais chaîne. (ASP.NET MVC2)

8
Artur Kędzior

J'ai rencontré une erreur composée similaire qui nécessitait deux solutions. Dans mon cas, la pile technologique était MVC/ASP.NET/IIS/JQuery. Le serveur échouait avec une erreur 500 et cela se produisait avant que la requête ne soit traitée par le contrôleur, ce qui rend le débogage difficile du côté serveur.

Le débogage côté client suivant m'a permis de déterminer l'erreur du serveur. 

Dans le rappel d'erreur $ .ajax, affichez le détail de l'erreur sur la console.

  error: (error) => {
                     console.log(JSON.stringify(error));
   }

Cela au moins m'a permis de voir l'erreur initiale du serveur

"La requête JSON était trop volumineuse pour être sérialisée"

Cela a été résolu dans le client web.config 

<appSettings>
    <add key="aspnet:MaxJsonDeserializerMembers" value="150000" />

Cependant, la demande toujours a échoué. Mais cette fois avec une erreur différente que je pouvais maintenant déboguer côté serveur

"Entité de requête trop grande"

Ce problème a été résolu en ajoutant les éléments suivants au service web.config.

<configuration>
…
 <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="524288">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"  />
        </binding>
      </basicHttpBinding>
    </bindings>

Les valeurs de configuration peuvent nécessiter un réglage supplémentaire, mais au moins, elles ont résolu les erreurs de serveur causées par la publication ajax.

8
Robotronic

Il devrait y avoir un événement enregistré dans EventVwr (Warning from asp.net), ce qui pourrait vous fournir plus de détails sur l'emplacement de l'erreur.

6
Ramesh

Un 500 de ASP.NET signifie probablement qu'une exception non gérée a été levée à un moment donné lors du traitement de la demande.

Je vous suggère de joindre un débogueur au processus du serveur Web (en supposant que vous y ayez accès).

Une chose étrange: vous faites une demande POST au serveur, mais vous ne transmettez aucune donnée (tout se trouve dans la chaîne de requête). Peut-être que cela devrait plutôt être une demande GET?

Vous devriez également vérifier que l'URL est correcte.

4
codeape

Vous pouvez également obtenir cette erreur dans VB si la fonction que vous appelez commence par Fonction publique partagée plutôt que Fonction publique dans le service Web. (Comme cela pourrait arriver si vous déplacez ou copiez la fonction hors d'une classe). Juste une autre chose à surveiller. 

3
Cody Hackjob

Je viens juste de faire face à ce problème aujourd'hui. avec ce type d'erreur, vous n'obtiendrez aucune réponse du serveur. Il est donc très difficile de localiser le problème.

Mais je peux vous dire qu'une "erreur de 500 serveur interne" est une erreur avec un serveur non client, vous avez une erreur dans le script côté serveur. Mettez en commentaire la fermeture du code après la fermeture et essayez de l'exécuter à nouveau. Vous découvrirez bientôt que vous manquez un personnage quelque part.

3
angry kiwi

J'ai pu trouver la solution à l'aide de Chrome debugger (Firebug ou d'autres outils tiers ne sont pas installés)

  • Aller sur l'onglet développeur (CTRL + MAJ + I)
  • Réseau > cliquez sur la demande qui a échoué, en rouge> Aperçu

Cela m'a montré que j'avais un problème sur le serveur lorsque je renvoyais une valeur qui faisait référence à soi-même.

2
Mikaël Mayer

Pouvez-vous poster la signature de votre méthode qui est supposée accepter ce post?

De plus, je reçois le même message d'erreur, probablement pour une raison différente. Mon YSOD a parlé du dictionnaire ne contenant pas de valeur pour la valeur non nullable. La façon dont j'ai obtenu les informations YSOD était de placer un point d'arrêt dans la fonction $ .ajax qui gérait un retour d'erreur comme suit:

<script type="text/javascript" language="javascript">
function SubmitAjax(url, message, successFunc, errorFunc) {
    $.ajax({
        type:'POST',
        url:url,
        data:message,
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success:successFunc,
        error:errorFunc
        });

};

Alors mon javascript errorFunc est comme ça:

function(request, textStatus, errorThrown) {
        $("#install").text("Error doing auto-installer search, proceed with ticket submission\n"
        +request.statusText); }

En utilisant IE, je suis allé dans le menu Affichage -> Script du débogueur -> break lors de la prochaine déclaration . Ensuite, je suis allé déclencher le code qui lirait mon message. Cela me conduisait généralement quelque part au fond de la bibliothèque de jQuery au lieu de ce que je voulais, car l'ouverture de la liste déroulante sélectionnée a déclenché jQuery. J'ai donc appuyé sur StepOver, puis la ligne suivante était également coupée, ce qui était l'endroit où je voulais être. Ensuite, VS passe en mode client (dynamique) pour cette page et je marque une pause dans la ligne $("#install") afin de voir (en utilisant le débogage) le contenu de la requête, textStatus, errorThrown. demande. Dans request.ResponseText, il y avait un message HTML où j'ai vu:

<title>The parameters dictionary contains a null entry for parameter 'appId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ContentResult CheckForInstaller(Int32)' in 'HLIT_TicketingMVC.Controllers.TicketController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.<br>Parameter name: parameters</title>

alors vérifiez tout cela, et postez votre signature de méthode de contrôleur au cas où cela fait partie du problème

2
Maslow

Je me suis retrouvé avoir cette erreur à. J'ai eu la redirection .htaccess configurée dans un répertoire. Eh bien, il redirige les appels ajax vers ofcourse ($.post(../ajax.php)), de sorte qu’il ne trouve pas le fichier réel (ce qui entraîne une erreur de 500).

Je l'ai 'réparé' en plaçant le fichier ajax.php dans un répertoire (donc .htaccess n'affectait pas).

2
Tessmore

Dans mon cas, c'était un problème simple, mais difficile à trouver. La directive de page avait des attributs hérités erronés. Il faut juste inclure le plus haut niveau et cela a fonctionné. 

Mauvais code

<%@ Page Language="C#" CodeBehind="BusLogic.aspx.cs" Inherits="BusLogic"%>

Code correct

<%@ Page Language="C#" CodeBehind="BusLogic.aspx.cs" Inherits="Web.BusLogic" %>
2
Jas

J'ai aussi fait face au même problème. Voici deux manières par lesquelles je l'ai résolu: 1. Si vous utilisez un framework, assurez-vous d’envoyer un jeton CSRF avec l’appel ajax également.

<meta name="_token" content="{{ csrf_token() }}">

Dans votre fichier js, assurez-vous d'appeler avant d'envoyer l'appel ajax

$.ajaxSetup({
            headers: {
                'X_CSRF-TOKEN' : $('meta[name="_token"]').attr('content')
            }
        });
  1. Une autre façon de le résoudre serait de changer method de post à get
1
Koushik Das

J'ai eu ce problème et j'ai découvert que la méthode C # côté serveur devait être static

Côté client:

$.ajax({
            type: "POST",
            url: "Default.aspx/ListItem_Selected",
            data: "{}",
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: ListItemElectionSuccess,
            error: ListItemElectionError
        });

        function ListItemElectionSuccess(data) {
            alert([data.d]);
        }
        function ListItemElectionError(data) {

        }

Du côté serveur:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public static String ListItem_Selected()
    {
        return "server responce";
    }
}
1
Apex ND

Lorsque vous utilisez la structure CodeIgniter avec la protection CSRF activée, chargez le script suivant dans chaque page où un ajax POST peut se produire:

$(function(){
    $.ajaxSetup({
        data: {
            <?php echo $this->config->item('csrf_token_name'); ?>: $.cookie('<?php echo $this->config->item('csrf_cookie_name'); ?>')
        }
    });
});

Requiert: jQuery et le plugin jQuery.cookie

Sources: https://stackoverflow.com/a/7154317/2539869 et http://jerel.co/blog/2012/03/a-simple-solution-to-codeigniter-csrf- protection et-ajax

1
Kevin Graveman

Les données JSON que vous transmettez au serveur doivent avoir le même nom que celui que vous avez créé dans le côté client.

var obj = {  Id: $('#CompanyId').val(),
             Name: $("#CompanyName").val()
            };

$.Ajax(data: obj,
url: "home/InsertCompany".....

Si le nom est différent, ex: 

[HttpPost]
public ActionResult InsertCompany(Int32 Id, string WrongName)
{
}

Vous obtiendrez cette erreur.

Si vous ne transmettez pas les données, supprimez l'attribut de données de la demande AJAX.

1
Nalan Madheswaran

J'ai trouvé cela survenu en chrome lorsque j'ai effectué deux requêtes ajax dans le gestionnaire jQuery 'on load', c'est-à-dire comme $ (function () {$ .ajax () ... $ .ajax () ...});

Je l'ai évité en utilisant:

setTimeout(function_to_do_2nd_ajax_request, 1);

c'est probablement un bug de chrome et/ou jquery

1
Sam Watkins

Pour moi, l’erreur était dans le fichier php auquel j’envoyais la demande . L’erreur était dans la connectivité de la base de données. Après avoir corrigé le code php, l'erreur a été résolue.

1
J4GD33P 51NGH

Comme mentionné, je pense que vos données de chaîne de retour sont très longues. le format JSON a donc été corrompu. 

Il y a une autre manière pour ce problème. Vous devez modifier la taille maximale des données JSON de cette manière:

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>
1
Emad Armoun

J'ai eu ce problème parce que la page que j'ai appelée publication ajax avait EnableViewState = "false" et EnableViewStateMac = "false" mais pas la page appelée. Quand j'ai mis cela dans les deux pages, tout a commencé à fonctionner. Je m'en doutais quand j'ai vu une exception d'adresse MAC.

1
user1228608

Je suis en retard sur ce point, mais je rencontrais ce problème et ce que j’ai appris, c’est qu’il s’agissait d’une erreur sur mon code PHP (dans mon cas, la syntaxe d’une sélection à la base de données). Habituellement, cette erreur 500 est quelque chose à faire en utilisant la syntaxe - dans mon expérience. En d'autres mots: "peopleware" issue! :RÉ

0
ArtFranco

En plus de la réponse "JSON mal formé", si la requête que vous exécutez renvoie un objet ou quoi que ce soit qui empêche la sérialisation des données, vous obtiendrez cette erreur. Vous devez toujours vous assurer que vous avez JSON et seulement JSON à la fin de votre méthode d'action ou quoi que ce soit pour lequel vous obtenez les données.

0
GidiBloke

Votre code contient dataType: json .

Dans ce cas, jQuery évalue la réponse en tant que JSON et renvoie un objet JavaScript. LeJSONdata est analysé de manière stricte. Toute erreurJSONest rejetée et une erreur d’analyse est renvoyée. Une réponse vide est également rejetée.

Le serveur doit plutôt renvoyer une réponse de null ou {}.

0
Subhash Diwakar

Vos données de chaîne de retour peuvent être très longues.

<system.web>        
   <compilation debug="true" targetFramework="4.0" />
   <httpRuntime maxRequestLength="2147483647" />
</system.web>

Par exemple:  

  • 1 caractère = 1 octet 
  • 5 caractères = 5 octets
  • "Hakki" = 5 octets
0
Hakkı Eser

Utilisez un bloc Try Catch sur votre serveur et dans le bloc catch, renvoyez l'erreur d'exception au client. Cela devrait vous donner un message d'erreur utile.

0
Jack Fairfield

J'ai rencontré des problèmes similaires avec le code AJAX qui renvoie sporadiquement le message "Erreur de serveur interne 500". J'ai résolu le problème en augmentant les valeurs "fastCGI" RequestTimeout et ActivityTimeout.

0
Steven Chinman