JQuery Ajax Post da como resultado un error interno del servidor 500

81

Estoy tratando de realizar esta publicación AJAX, pero por alguna razón recibo un error del servidor 500. Puedo verlo tocar puntos de ruptura en el controlador. Entonces el problema parece estar en la devolución de llamada. ¿Nadie?

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

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

Esta es la cadena que debe devolverse:

{status:'200', text: 'Something'}
Mella
fuente
.ashx = plataforma .NET? ¿Qué tiene esto que ver con Java?
Matt b
¿Es posible realizar la llamada correctamente sin el signo $ o el prefijo jQuery delante de ".ajax"?
Sinan
Sí ... Estoy usando jQuery.noConflicts (). El prefijo es correcto. Como dije. Realiza la solicitud ... pero se devuelve el error.
Nick
Consulte la publicación aquí developersnote.com/2014/01/…
shamcs
El enlace anterior de @shamcs contiene una cadena al final que lo invalida. El enlace correcto es developersnote.com/2014/01/…
Erenor Paz

Respuestas:

67

Sospecho que el método del servidor está lanzando una excepción después de que pasa su punto de interrupción. Utilice Firefox / Firebug o las herramientas de desarrollo de IE8 para ver la respuesta real que obtiene del servidor. Si ha habido una excepción, obtendrá el html de YSOD, que debería ayudarlo a averiguar dónde buscar.

Una cosa más: su propiedad de datos debe ser {} no "{}", el primero es un objeto vacío mientras que el segundo es una cadena que no es válida como parámetro de consulta. Mejor aún, déjelo fuera si no está pasando ningún dato.

tvanfosson
fuente
2
Su primera oración es engañosa (implicando que el error 500 ocurre en el lado del cliente). Casi te voté en contra antes de leer la respuesta más a fondo. Quizás quieras aclarar un poco.
Macha
4
fiddler2.com también es muy útil para ver la respuesta real del servidor.
Glen Little
: o algo en lo que Chrome Dev Tools realmente se queda corto.
Jimmy
1
en realidad, puede depurar esto en Chrome, consulte esta respuesta para obtener detalles stackoverflow.com/a/21786593/14533
Pixelomo
33

en caso de que si alguien usa el marco de codeigniter, el problema puede ser causado por la configuración de protección csrf habilitada.

v1r00z
fuente
7
Entré en este problema hace unos minutos ... tu respuesta me dio la pista :) Quizás sea interesante para otros evitar esto. Agregar esto a los datos resuelve el problema: <? = $ This-> security-> get_csrf_token_name ()? >: '<? = $ this-> security-> get_csrf_hash ()?>'
soupdiver
Gracias, me quedé atascado en esto en Bonfire y todavía no conozco CodeIgniter lo suficientemente bien como para descubrirlo.
Andyface
19

Yo mismo tuve este problema, aunque no pude encontrar el motivo en mi caso, al cambiar de POSTa GET, ¡el error 500 del problema desapareció!

 type:'POST'
Stian
fuente
9
pero no una solución real. Algunas cosas tienen que ser POST
atilkan
2
Eso está completamente mal. Si cambiar POST a GET realmente funcionó, entonces estaba usando el HTTPVerb incorrecto en primer lugar. Si debe usar POST porque, por ejemplo, está enviando una carga útil, debe usar POST y el uso de GET no funcionaría. Y, por otro lado, si solo está obteniendo algo y puede usar GET, no use POST, GET se almacena en caché (dependiendo a veces de la configuración)
polonskyg
18

Este es el código simple de solicitud Ajax para obtener datos a través de la solicitud 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");
    }
});
BTE
fuente
3
contentType: "application / json; charset = utf-8",
eliminé
11

Experimenté un error compuesto similar, que requirió dos soluciones. En mi caso, la pila de tecnología fue MVC / ASP.NET / IIS / JQuery. El lado del servidor estaba fallando con un error 500, y esto ocurría antes de que el controlador manejara la solicitud, lo que dificultaba la depuración en el lado del servidor.

La siguiente depuración del lado del cliente me permitió determinar el error del servidor

En la devolución de llamada de error $ .ajax, muestre el detalle del error en la consola

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

Esto al menos me permitió ver el error inicial del servidor.

"La solicitud JSON era demasiado grande para serializarse"

Esto se resolvió en el cliente web.config

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

Sin embargo, la solicitud aún falló. Pero esta vez con un error diferente que ahora pude depurar en el lado del servidor

"Solicitar entidad demasiado grande"

Esto se resolvió agregando lo siguiente al servicio 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>

Los valores de configuración pueden requerir un ajuste adicional, pero al menos resolvió los errores del servidor causados ​​por la publicación ajax.

Robotronic
fuente
10

Puede buscar códigos de estado HTTP aquí (o aquí ), este error le dice:

"El servidor encontró una condición inesperada que le impidió cumplir con la solicitud".

Necesitas depurar tu servidor.

Tom
fuente
Gracias, tuve este problema, en el archivo de acción no pude conectarme a la base de datos para almacenar datos, por lo que jQuery post (). Done () obtuvo un error 500.
Harkály Gergő
8

Hoy me encuentro con lo mismo. Como se sugirió antes, obtenga Firebug para Firefox, habilite la consola y obtenga una vista previa de la respuesta POST. Eso me ayudó a descubrir cuán estúpido era el problema. Mi acción esperaba un valor de un tipo int y estaba publicando una cadena. (ASP.NET MVC2)

Artur Kędzior
fuente
6

Debería haber un evento registrado en EventVwr (Advertencia de asp.net), que podría brindarle más detalles sobre dónde podría estar el error.

Ramesh
fuente
4

Un 500 de ASP.NET probablemente significa que se lanzó una excepción no controlada en algún momento al atender la solicitud.

Le sugiero que adjunte un depurador al proceso del servidor web (suponiendo que tenga acceso).

Una cosa extraña: realiza una solicitud POST al servidor, pero no pasa ningún dato (todo está en la cadena de consulta). ¿Quizás debería ser una solicitud GET en su lugar?

También debe verificar que la URL sea correcta.

codeape
fuente
Correcto ... Estaba usando un GET originalmente pero obtengo el mismo error.
Nick
1
¿Ha intentado realizar la solicitud desde la barra de direcciones del navegador? ¿Obtienes también un estado de 500?
Codeape
3

Hoy me enfrento a este problema. con este tipo de error, no obtendrá ninguna respuesta del servidor, por lo tanto, es muy difícil localizar el problema.

Pero puedo decirle que "500 error de servidor interno" es un error con el servidor, no con el cliente, tiene un error en el script del lado del servidor. Comente el código de cierre por cierre e intente ejecutarlo nuevamente, pronto descubrirá que extraña un personaje en alguna parte.

kiwi enojado
fuente
3

También puede obtener ese error en VB si la función que está llamando comienza con Public Shared Function en lugar de Public Function en el servicio web. (Como podría suceder si mueve o copia la función fuera de una clase). Solo otra cosa a tener en cuenta.

Cody Hackjob
fuente
2

¿Puede publicar la firma de su método que se supone que acepta esta publicación?

Además, recibo el mismo mensaje de error, posiblemente por una razón diferente. Mi YSOD habló de que el diccionario no contiene un valor para el valor que no acepta valores NULL. La forma en que obtuve la información de YSOD fue poner un punto de interrupción en la función $ .ajax que manejó una devolución de error de la siguiente manera:

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

};

Entonces mi errorFunc javascript es así:

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

Usando IE fui al menú de visualización -> depurador de script -> romper en la siguiente declaración. Luego fui a activar el código que lanzaría mi publicación. Esto generalmente me llevó a algún lugar dentro de la biblioteca de jQuery en lugar de donde quería, porque la apertura desplegable de selección activó jQuery. Entonces presioné StepOver, luego la siguiente línea real también se rompería, que era donde quería estar. Luego, VS entra en modo del lado del cliente (dinámico) para esa página, y puse un salto en la $("#install")línea para poder ver (usando el mouse sobre la depuración) lo que estaba en request, textStatus, errorThrown. solicitud. En request.ResponseText había un mensaje html donde vi:

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

así que verifique todo eso y publique la firma del método de su controlador en caso de que eso sea parte del problema

Maslow
fuente
2

Me encontré teniendo este error. Tenía la redirección .htaccess configurada en un directorio. Bueno, redirige las llamadas ajax a ofcourse ( $.post(../ajax.php)), por lo que no pudo encontrar el archivo real (lo que resultó en un error 500).

Lo 'arreglé' colocando el ajax.php en un directorio (por lo .htaccessque no afectó).

Tessmore
fuente
2

Pude encontrar la solución usando el depurador de Chrome (no tengo Firebug u otras herramientas de terceros instaladas)

  • Ir a la pestaña de desarrollador (CTRL + MAJ + I)
  • Red > haga clic en la solicitud que falló, en rojo> Vista previa

Me mostró que tenía un problema en el servidor, cuando estaba devolviendo un valor que era autoreferenciado.

Mikaël Mayer
fuente
2

En mi caso fue un problema simple, pero difícil de encontrar. La directiva de página tenía atributos de Herencia incorrectos. Solo necesita incluir el nivel superior y funcionó.

Codigo erroneo

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

Código correcto

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

Cuando use el marco CodeIgniter con la protección CSRF habilitada, cargue el siguiente script en cada página donde pueda ocurrir una POST ajax:

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

Requiere: plugin jQuery y jQuery.cookie

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

Kevin
fuente
1

Los datos JSON que está pasando al servidor deben tener el mismo nombre que el que forma en el lado del cliente. Ex:

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

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

Si el nombre es diferente, ex:

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

Obtendrá este error.

Si no está pasando los datos, elimine el atributo de datos de la solicitud AJAX.

Nalan Madheswaran
fuente
1

Tuve este problema y descubrí que el método C # del lado del servidor debería ser estático .

Lado del cliente:

$.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) {

        }

Lado del servidor:

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";
    }
}
Apex ND
fuente
¿Puedo obtener un ejemplo sobre cómo obtener el objeto JSON y las propiedades en el lado del servidor? Si datos: {Prop1: "asdf", Prop2: "zxcv"}, ¿cómo obtengo los valores Prop1 y Prop2 dentro de la función pública estática String ListItem_Selected ()? Gracias.
Mehdi Anis
1

Como se mencionó, creo que los datos de su cadena de retorno son muy largos. por lo que el formato JSON se ha dañado.

Hay otra forma de resolver este problema. Debe cambiar el tamaño máximo de los datos JSON de esta manera:

Abra el archivo Web.Config y pegue estas líneas en la sección de configuración

<system.web.extensions>
  <scripting>
    <webServices>
      <jsonSerialization maxJsonLength="50000000"/>
    </webServices>
  </scripting>
</system.web.extensions>
Emad Armoun
fuente
1

También enfrenté el mismo problema. Aquí hay dos formas en que lo he resuelto: 1. Si está utilizando algún marco, asegúrese de enviar un token CSRF con la llamada ajax también.

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

En su archivo js, ​​asegúrese de llamar a esto antes de enviar la llamada ajax

$.ajaxSetup({
            headers: {
                'X_CSRF-TOKEN' : $('meta[name="_token"]').attr('content')
            }
        });
  1. Otra forma de solucionarlo sería cambiar methodde postaget
Koushik Das
fuente
1

Para mí, el error estaba en el archivo php al que estaba enviando la solicitud. Se produjo un error en la conectividad de la base de datos. Después de corregir el código php, se resolvió el error.

J4GD33P 51NGH
fuente
1

Su código contiene dataType: json .

En este caso, jQuery evalúa la respuesta como JSON y devuelve un objeto JavaScript. Los datos JSON se analizan de forma estricta. Se rechaza cualquier JSON con formato incorrecto y se genera un error de análisis. También se rechaza una respuesta vacía.

El servidor debería devolver una respuesta de nullo en su {}lugar.

Subhash Diwakar
fuente
1

Encontré que esto ocurrió en Chrome cuando hice dos consultas ajax en el controlador jquery ' on load ',

es decir, como $(function() { $.ajax() ... $.ajax() ... });

Lo evité usando:

setTimeout(function_to_do_2nd_ajax_request, 1);

es presumiblemente un error de Chrome y / o jquery

Sam Watkins
fuente
1

Tuve este problema porque la página desde la que llamé ajax post tenía EnableViewState="false"y EnableViewStateMac="false"no la página llamada.

Cuando puse esto en ambas páginas, todo empezó a funcionar. Sospeché esto cuando vi la excepción de la dirección MAC.

sandip
fuente
0

Los datos de su cadena de retorno pueden ser muy largos.

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

Por ejemplo:

  • 1 carácter = 1 byte
  • 5 caracteres = 5 bytes
  • "Hakki" = 5 bytes
Hakkı Eser
fuente
0

Utilice un bloque Try Catch en el lado del servidor y en el bloque catch devuelva el error de excepción al cliente. Esto debería darle un mensaje de error útil.

Jack Fairfield
fuente
0

He tenido problemas similares con el código AJAX que esporádicamente devuelve el "error 500 del servidor interno". Resolví el problema aumentando los valores de RequestTimeout y ActivityTimeout de "fastCGI".

Steven Chinman
fuente
¿A qué servidor web se refiere? ¿Podría agregar algún código por favor?
Max Leske
0

Llegué tarde, pero estaba teniendo este problema y lo que aprendí fue que era un error en mi código PHP (en mi caso, la sintaxis de una selección de la base de datos). Por lo general, este error 500 es algo que se debe hacer usando la sintaxis, en mi experiencia. En otras palabras: ¡problema de "software para personas"! :RE

ArtFranco
fuente
0

Además de la respuesta "JSON con formato incorrecto", si la consulta que está ejecutando devuelve un objeto o cualquier cosa que impida que los datos se serialicen, obtendrá este error. Siempre debe asegurarse de tener JSON y solo JSON al final de su método de acción o lo que sea que esté obteniendo los datos.

GidiBloke
fuente
0

Por lo general, su propiedad no es del todo correcta o hay algún problema con el procesamiento de su servidor.

Bcktr
fuente