none
Error al ejecutar segunda petición ajax RRS feed

  • Pregunta

  • Buenas,

    Tengo la siguiente petición ajax:

    $.ajax({
                url: '/ConvalAsignatura/Create',
                type: "post",
                dataType: "html",
                data: new FormData(document.getElementById("frmRegistroAsignatura")),
                cache: false,
                contentType: false,
                processData: false,
                success: function (data, status) {
                    if (status == 'success') {
                        var respuesta = JSON.parse(data);
    
                        if (respuesta.Type == 'S') {
                            $.fn.uf_ActualizaAcordeon(respuesta.Data, respuesta.Data.DtoDetalleAsignatura);
                        }
                        else if (respuesta.Type == 'E') {
                            alert(respuesta.Data);
                        }
                        else if (respuesta.Type == 'R') {
                            window.location.href = respuesta.Data;
                        }
                    }
                    else
                        alert('Fallo al agregar la asignatura');
                },
                error: function (e) {
                    alert('Ocurrió un error [' + e.statusText + ']');
                }
            })

    El formulario envía cajas de texto y archivos. Si hago un primer request todo va bien, el problema ocurre al enviar nuevamente el formulario para grabar otro registro. Arroja el siguiente error en el servidor.

    Ya llevo buen rato dando vueltas, hace un par de día no tenía este problema :(

    miércoles, 4 de abril de 2018 16:44

Todas las respuestas

  • Muestre el código de servidor, y también copie y pegue aquí el StackTrace completo de la excepción.

    Jose R. MCP
    Code Samples

    miércoles, 4 de abril de 2018 16:52
  • El código del controller es simple, se ejecuta correctamente:

    [HttpPost]
    public ActionResult Create(TramiteSolicitudVM vm)
    {
    	JsonResult result;
    	
    	try
    	{
    		// bla bla más código
    
    		if (result != null) return result;
    
    		if (!ModelState.IsValid)
    		{
    			result = Json(new { Type = "E", Data = "No se han completado los datos del formulario" }); // Esto ya se valida por jQuery validate
    		}
    		else
    		{
    			vm = Procesar(vm);
    		}
    
    		result = Json(new { Type = "S", Data = vm } );
    	}
    	catch (Exception ex)
    	{
    		result = Json(new { Type = "E", Data = ex.Message });
    	}
    
    	return result;
    }

    La ejecución del segundo ajax llega hasta el return con el JSON correcto pero luego de ello se va al global asax al método de caputra de error. El StackTrace completo contiene:

       en System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
       en System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
       en System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
       en System.Web.SecurityUtils.MethodInfoInvoke(MethodInfo method, Object target, Object[] args)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable enumerable, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable enumerable, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
       en System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, StringBuilder output, SerializationFormat serializationFormat)
       en System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, SerializationFormat serializationFormat)
       en System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext context)
       en System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
       en System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
       en System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
       en System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
       en System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<>c__DisplayClass2b.<BeginInvokeAction>b__1c()
       en System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult)
       en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult)
       en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
       en System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult)
       en System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState)
       en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
       en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
       en System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)
       en System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller)
       en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
       en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
       en System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)
       en System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult)
       en System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState)
       en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
       en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
       en System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
       en System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
       en System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
       en System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

    miércoles, 4 de abril de 2018 17:00
  • hola

    el objeto que intentas envar como parte del json, o sea "vm" de casualidas es una entidad que mapeas con entity framework ?

    porque de ser asi no puedes retornarla directamente, derias mapearla a otra entidad, ya que el proxy y lazy load que usa EF causa problemas al serializar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 4 de abril de 2018 17:31
  • He detectado que la siguiente línea que se encuentra dentro del método Procesar es la que causa el problema:

    vm.DtoDetalleAsignatura.ArchivoSilabo = ValidarArchivo(viewModel.DtoDetalleAsignatura.ArchivoSilabo);

    Siendo la propiedad ArchivoSilabo un objeto de tipo HttpPostedFileBase. Lo curioso es que el archivo llega correctamente al servidor y lo único que hace dicho método es validar extensión y tamaño:

    private HttpPostedFileBase ValidarArchivo(HttpPostedFileBase file)
    {
    	try
    	{   
    		// Verificar extensiones
    		var extensionArchivo = Path.GetExtension(file.FileName).Substring(1);
    		var extensionesPermitidas = blMaestro.ObtenerMaestroPorStrCod("FILE_SERVER_TCA", "EXT").DTOMaestro.descripcion.Split('|');
    		var qExtensiones = extensionesPermitidas.FirstOrDefault(t => string.Equals(t, extensionArchivo, StringComparison.OrdinalIgnoreCase));
    
    		if (qExtensiones.Count() == 0)
    			throw new Exception("El archivo contiene una extensión no permitida");
    
    		var tamanioArchivoKB = file.ContentLength / 1024.0;   // Dividimos entre 1024 para convertir de B a Kb
    		var tamanioMaximoKB = blMaestro.ObtenerMaestroPorStrCod("FILE_SERVER_TCA", "SIZE").DTOMaestro.codigo_num; // En Kb
    
    		if (tamanioArchivoKB > tamanioMaximoKB)
    			throw new Exception($"El archivo excede el tamaño máximo permitido {tamanioMaximoKB / 1024.0}MB");
    
    		return file;
    	}
    	catch (Exception ex)
    	{
    		throw ex;
    	}
    }

    Si comento dicha línea que invoca al método ya no ocurre el error, pero necesito validar en el server los archivos.

    No entiendo porqué ocurre esto :(

    Leandro: el objeto vm no es una clase de EF, es una clase que hace de ViewModel y la declaro en la carpeta Models de la capa  de presentación.
    • Editado eduar2083 miércoles, 4 de abril de 2018 19:28
    miércoles, 4 de abril de 2018 19:23
  • Ya me dí cuenta :(

    No se puede asignar el objeto de tipo HttpPostedFileBase

    miércoles, 4 de abril de 2018 19:36