C # Post AJAX resultado json vacío

Aug 19 2020

Hago una solicitud POST ajax para realizar una acción y devolver un resultado sin volver a cargar la página.
Para esto utilizo un JSON Result, el problema es que cuando mi acción "foo.DoSyncAction (id)" tarda un poco en ejecutarse, los mensajes devueltos son nulos.
Por ejemplo, cuando se genera una excepción, la excepción se detecta, pero su mensaje es nulo.

Lo mismo sucede cuando no se lanza ninguna excepción, "actionResult" es nulo.
Si utilizo una acción que lleva menos tiempo, los mensajes devueltos no son nulos ni vacíos.
Y no sucede en el modo de depuración, el mensaje devuelto a mi página no es nulo.
Creo que lo olvidé o estoy haciendo algo mal, pero no puedo entender qué está mal.

[HttpPost]
public JsonResult SomeAction(int id)
{
    try
    {
        Foo foo = new Foo();
        var actionResult = foo.DoSyncAction(id);

        return Json(new { ok = true, data = actionResult }, JsonRequestBehavior.AllowGet); ;
    }
    catch (Exception ex)
    {

        return Json(new { data = ex == null ? "null ex" : (string.IsNullOrEmpty(ex.Message) ? "this exception is empty" : ex.Message) }, JsonRequestBehavior.AllowGet);
    }
}

Mi consulta AJAX:

$.ajax({
    url: '@Url.Action("SomeAction", "MyController")',
    dataType: 'json',
    data: { id: myID },
    type: 'POST',
    success: function (response) {
        if (response.ok) {
            // When everything is ok
            console.log(response.data);
        } else {
            // When an exception is thrown
            console.log("An error occurred :  " + response.data);

        }
    },
    error: function (error) {
        console.log("An error occurred :  " + error.responseText);
    }
});

Aquí hay un ejemplo de una situación similar: dotnetfiddle.net/cG2L0u Utilizo el ejemplo de Sagnalrac con una espera de 10 segundos y se produjo mi problema. La lista de elementos ya no se muestra y console.log devuelve una cadena vacía. Estoy usando ASP MVC 5 con .NET 4.8

Respuestas

Tanguy Aug 23 2020 at 17:01

Resolví mi problema, pero todavía tengo algunos malentendidos.

Mi método devuelve una excepción relacionada sistemáticamente con la cuenta que ejecuta el método (es por eso que en la depuración funciona, mientras que en un servidor web no lo hace, porque las cuentas utilizadas son diferentes).

Lo extraño es que mi método arroja una excepción, incluso me las arreglo para capturarla y enviarla por correo. Pero cuando el controlador detecta la excepción, está vacía o nula. Intentaré analizar más de cerca este problema.

Una vez que solucioné el problema, traté de agregar un tiempo de espera de 2 minutos y no ocurrió ningún problema (creo que en el ejemplo, dotnetfiddle tiene una configuración diferente a la mía, por eso no aparece ninguna excepción).