Tengo una aplicación mvc asp.net simple con algunos controles de desarrollo. La pantalla principal tiene un botón que toma la fecha de la pantalla y realiza el procesamiento final. VISTA:
@Html.DevExpress().Button(settings => { settings.Name = "LoadData"; settings.Text = "Load Data"; settings.ToolTip = "Imports data from Holding API"; settings.ClientSideEvents.Click = "OnClick"; settings.UseSubmitBehavior = false; }).GetHtml() function OnClick(s, e) { positionDate = ReportingPositionDate.GetDate().toDateString(); $.ajax({ type: "POST", //url: "/ImportData/DataFileUpload", url: "@Url.Action("DataFileUpload", "ImportData")", data: JSON.stringify({ positionDate: positionDate }), dataType: "text", contentType: "application/json; charset=utf-8", beforeSend: function () { lpImport.Show(); }, success: function (msg) { ImportDataGridView.PerformCallback(); ImportSuccessMessage.SetVisible(true); ImportSuccessMessage.SetText(msg); lpImport.Hide(); }, Error: function (xhr) { alert(xhr) ImportDataGridView.PerformCallback(); } }); } }Controlador:
[HttpPost] public ActionResult DataFileUpload(string positionDate) { // Reset validation error collection ImportDataValidationErrors = new List<ImportFileRecord>(); string[] errs; try { ReturnVal ="Some Long Running Process" return Content(ReturnVal); } catch (Exception ex) { throw ex; } }El proceso tarda unos 50 minutos (o más) en ejecutarse (esperado). El método del controlador DataFileUpload realiza todas las acciones correctamente cuando se trata de volver a Ver, simplemente cuelga. Supongo que mi pantalla se ha agotado y no acepta ninguna respuesta del controlador. Cuando ejecuto el mismo proceso con un conjunto de datos más pequeño, vea obtener valor del controlador. ¿Alguna idea de lo que podría estar yendo mal aquí? ¿Algún problema con la configuración de mis botones? Agradezco toda ayuda.
El valor de tiempo de espera predeterminado de Jquery Ajax es 0. Esto significa que no hay tiempo de espera en ajax. Si el navegador tiene algún tiempo de espera, es muy posible que lo haga.
Solo cuando se especifica una opción de tiempo de espera, jQuery incluso llama a setTimeout().
También hay otro desafío. Hay un tiempo de espera del navegador para ajax (XMLHttpRequest), es diferente para cada navegador, especialmente para IE. Supongo que son 30 minutos más o menos. Técnicamente, puede configurar el tiempo de timeout : 10000000 es entre 2,30 y 3 horas.
Me enfrenté a este problema antes. Puedes resolver con la barra de progreso. Con la barra de progreso puede mantener actualizada su vista.
Para una simple solicitud de ajax que puede usar.
function uploadFile(){ myApp.showProgressDialog; //show dialog var file=document.getElementById('fileName').files[0]; var formData = new FormData(); formData.append("file_name", file); ajax = new XMLHttpRequest(); ajax.upload.addEventListener("progress", ProgressBarHandler, false); ajax.addEventListener("load", OnCompleteHandler, false); ajax.open("POST", "/to/action"); ajax.send(formData); } function ProgressBarHandler(event){ var percent = (event.loaded / event.total) * 100; $('.bar').width(percent); // its coming from css } function OnCompleteHandler(){ myApp.hidePleaseWait(); //hide dialog $('.bar').width(100); }