none
Respuesta Task a Javascript RRS feed

  • Pregunta

  • Hola,

    tengo el siguiente código en una web asp.net:

    protected void BtnInstalarLaAplicacion_Click(object sender, EventArgs e)
            {
                string AppUsuario = instAppUsuario.Text.Trim();
                string AppPswrd = instAppPswrd.Text.Trim();
                string ConfServer = instServer.Text.Trim();
                string ConfBBDD = instBBDD.Text.Trim();
                string ConfUsuario = instBBDDUser.Text.Trim();
                string ConfPswrd = instBBDDPswrd.Text.Trim();
                string DtServer = instServerDT.Text.Trim();
                string DtBBDD = instBBDDDT.Text.Trim();
                string DtUsuario = instBBDDDTUser.Text.Trim();
                string DtPswrd = instBBDDDTPswrd.Text.Trim();

                if (AppUsuario == "" || AppPswrd == "" || ConfServer == "" || ConfBBDD == "" || ConfUsuario == ""
                     || ConfPswrd == "" || DtServer == "" || DtBBDD == "" || DtUsuario == "" || DtPswrd == "") {

                    script = "aviso('Faltan datos por especificar!','avisoCerrar()')";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "script", script, true);
                    return;
                }

                script = "aviso('Instalando la aplicación...<br>por favor, espera...<br><br>No cierres el navegador<br><br><img src=\"../images/loading.gif\" width=\"50\">"
                            + "<div id=\"dvInstInfo\" style=\"padding-top:30px;\">"
                            + "      <img src=\"../images/loading.gif\" width=\"16\"> Verificando la conexión con el servidor de configuración..."
                            + "</div>')";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "script", script, true);


                Task.Run(() =>
                {
                    try
                    {
                        SqlConnection conexion = new SqlConnection("server=" + ConfServer + "; integrated security=true; Connection Timeout=5");
                        conexion.Open(); conexion.Close();

                    }
                    catch (SqlException)
                    {
                        ScriptManager.RegisterStartupScript(this, typeof(Page), "ErrorConfServer", "$('#dvInstInfo').html('Error ConfServer!!!');", true);
                        instBBDDDTPswrd.Text = "Error ConfServer!";
                    }
                });
            }

    El código funciona bien hasta que necesito la respuesta de la conexión SQL.

    No se ejecuta el ScriptManager ni se modifica el texto del TextBox.

    ¿Alguna sugerencia?

    Gracias!


    Ely Jené

    domingo, 19 de enero de 2020 12:14

Respuestas

  • No, no puedes hacer lo que intentas hacer. Estás pensando en una aplicación de escritorio, pero en una aplicación ASP.NET eso no funciona.

    Piensa en cómo funciona el webform: Cuando pulsas el BtnInstalar, se envía una petición desde el navegador al servidor que hace que se instancie la clase, se ejecute y se devuelva el HTML al navegador. En ese momento, la instancia de la clase se descarta y deja de estar conectada con el navegador. Normalmente en este punto se destruye la instancia porque se vuelve inalcanzable, pero en tu caso no se destruye debido a que todavía está ejecutándose el Task. Pero cuando el Task termina, es completamente inútil tratar de asignar un valor al .Text de un control o al ScriptManager, porque en este momento el HTML ya ha sido enviado a la página y la página ya se ha pintado y la instancia de la clase que está ejecutando tu código ya no puede enviar nada hacia la página.


    domingo, 19 de enero de 2020 18:20
  • hola

    No entiendo cual es el objetivo que quieres conseguir con ese codigo, pero si lanzas algo en un thread cuando usas el Task.Run() esto se ejecutar en un segundo plano no afectando a la parte visual

    Ademas en un thread no puede acceder a controles de la pagina como haces con el instBBDDDTPswrd

    Seguramente solo veas el primer ScriptManager.RegisterStartupScript(), pero no el que lanzas en el Task

    para informar avance en este seguramente debas usar SignalR

    entonces podrias hacer push server y enviar notificaciones al cliente, usando websocket

    Real-time ASP.NET with SignalR

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 20 de enero de 2020 5:11
  • Hola,

    la idea de usar una Task es porque, como bien dice Alberto, estoy acostumbrado a las aplicaciones de escritorio, y tengo algún bloqueo por ahí: si hago ScriptManager.RegisterStartupScript(this, typeof(Page), "script", script, true); y seguidamente el Try de la conexión, el ScriptManager se queda colgado hasta que hay respuesta de la conexión, con lo que el usuario se encuentra con la pantalla bloqueada.

    ¿Cómo puedo obtenerlo?

    Saludos,


    Ely Jené

    lunes, 20 de enero de 2020 17:54
  • Lo que necesito es avisar de que voy a probar la conexión y devolver la respuesta al navegador.

                                      

      script = "aviso('Verificando la conexión con el servidor de configuración...</div>')";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "script", script, true);

                try
                {
                    SqlConnection conexion = new SqlConnection("server=" + ConfServer + "; integrated security=true; Connection Timeout=5");
                    conexion.Open(); conexion.Close();
                  // seguir con el programa
                }
                catch (SqlException)
                {
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "ErrorConfServer", "$('#dvInstInfo').html('No se ha podido conectar con el servidor de Configuración!!!');", true);
                    instBBDDDTPswrd.Text = "Error ConfServer!";

                }

    Muchas gracias!


    Ely Jené



    lunes, 20 de enero de 2020 18:11
  • >>Lo que necesito es avisar de que voy a probar la conexión y devolver la respuesta al navegador.

    Pero entonces no uses ninguna Task, prueba la conexion y le retornas el Response al usuario con el resultado

    Si usas Task realizas la operacion en un thread separado, pero para cuando esto sucede el Response continuo y le retorno al usuario el render del html que debe mostrar en el browser

    >>estoy acostumbrado a las aplicaciones de escritorio, y tengo algún bloqueo por ahí:

    puede deberias estudiar las reglas de un desarrollo web, son muy distintas a las desktop

    en la web hay request y response del render que se envia del servidor al cliente y eso debes respectarlo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    lunes, 20 de enero de 2020 18:18

Todas las respuestas

  • No, no puedes hacer lo que intentas hacer. Estás pensando en una aplicación de escritorio, pero en una aplicación ASP.NET eso no funciona.

    Piensa en cómo funciona el webform: Cuando pulsas el BtnInstalar, se envía una petición desde el navegador al servidor que hace que se instancie la clase, se ejecute y se devuelva el HTML al navegador. En ese momento, la instancia de la clase se descarta y deja de estar conectada con el navegador. Normalmente en este punto se destruye la instancia porque se vuelve inalcanzable, pero en tu caso no se destruye debido a que todavía está ejecutándose el Task. Pero cuando el Task termina, es completamente inútil tratar de asignar un valor al .Text de un control o al ScriptManager, porque en este momento el HTML ya ha sido enviado a la página y la página ya se ha pintado y la instancia de la clase que está ejecutando tu código ya no puede enviar nada hacia la página.


    domingo, 19 de enero de 2020 18:20
  • hola

    No entiendo cual es el objetivo que quieres conseguir con ese codigo, pero si lanzas algo en un thread cuando usas el Task.Run() esto se ejecutar en un segundo plano no afectando a la parte visual

    Ademas en un thread no puede acceder a controles de la pagina como haces con el instBBDDDTPswrd

    Seguramente solo veas el primer ScriptManager.RegisterStartupScript(), pero no el que lanzas en el Task

    para informar avance en este seguramente debas usar SignalR

    entonces podrias hacer push server y enviar notificaciones al cliente, usando websocket

    Real-time ASP.NET with SignalR

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 20 de enero de 2020 5:11
  • Hola,

    la idea de usar una Task es porque, como bien dice Alberto, estoy acostumbrado a las aplicaciones de escritorio, y tengo algún bloqueo por ahí: si hago ScriptManager.RegisterStartupScript(this, typeof(Page), "script", script, true); y seguidamente el Try de la conexión, el ScriptManager se queda colgado hasta que hay respuesta de la conexión, con lo que el usuario se encuentra con la pantalla bloqueada.

    ¿Cómo puedo obtenerlo?

    Saludos,


    Ely Jené

    lunes, 20 de enero de 2020 17:54
  • Lo que necesito es avisar de que voy a probar la conexión y devolver la respuesta al navegador.

                                      

      script = "aviso('Verificando la conexión con el servidor de configuración...</div>')";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "script", script, true);

                try
                {
                    SqlConnection conexion = new SqlConnection("server=" + ConfServer + "; integrated security=true; Connection Timeout=5");
                    conexion.Open(); conexion.Close();
                  // seguir con el programa
                }
                catch (SqlException)
                {
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "ErrorConfServer", "$('#dvInstInfo').html('No se ha podido conectar con el servidor de Configuración!!!');", true);
                    instBBDDDTPswrd.Text = "Error ConfServer!";

                }

    Muchas gracias!


    Ely Jené



    lunes, 20 de enero de 2020 18:11
  • >>Lo que necesito es avisar de que voy a probar la conexión y devolver la respuesta al navegador.

    Pero entonces no uses ninguna Task, prueba la conexion y le retornas el Response al usuario con el resultado

    Si usas Task realizas la operacion en un thread separado, pero para cuando esto sucede el Response continuo y le retorno al usuario el render del html que debe mostrar en el browser

    >>estoy acostumbrado a las aplicaciones de escritorio, y tengo algún bloqueo por ahí:

    puede deberias estudiar las reglas de un desarrollo web, son muy distintas a las desktop

    en la web hay request y response del render que se envia del servidor al cliente y eso debes respectarlo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    lunes, 20 de enero de 2020 18:18
  • Hola de nuevo.

    Gracias por vuestra ayuda.

    No consigo obtener lo que necesito, que es informar de si la conexión ha sido correcta o no.

    Os paso parte del código para ver si me podéis iluminar,

    .

    .

    .

          }
                else {
                    script = "aviso('Instalando la aplicación...<br>por favor, espera...<br><br>No cierres el navegador<br><br><img src=\"../images/loading.gif\" width=\"50\">"
                                + "<div id=\"dvInstInfo\" style=\"padding-top:30px;\">"
                                + "      <img src=\"../images/loading.gif\" width=\"16\"> Verificando la conexión con el servidor de configuración..."
                                + "</div>')";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "script", script, true);
                    
                    if (verificarConfServer(ConfServer)) { }
                    else { ScriptManager.RegisterStartupScript(this, typeof(Page), "ErrorConfServer", "$('#dvInstInfo').html('No se ha podido conectar con el servidor de Configuración!!!');", true); }
                }
            }

            bool verificarConfServer(string ConfServer) {
                try
                {
                    SqlConnection conexion = new SqlConnection("server=" + ConfServer + "; integrated security=true; Connection Timeout=5");
                    conexion.Open(); conexion.Close();
                    return true;
                }
                catch (SqlException){ return false; }
            }
        }
    }


    Ely Jené

    viernes, 24 de enero de 2020 19:48
  • hola

    >>No consigo obtener lo que necesito, que es informar de si la conexión ha sido correcta o no.

    pero estas integrando jquery ?

    si despues que carga la pagina analizas la Console de developer tools del browser (a la cual accedes con F12) puedes ver algun error

    podrias tambien analizar el codigo analizando el html

    Ademas eso de poner un mensaje de "Verificando la conexion ..." y despues poner algo en el div "No se ha podido ..." solo vas a ver los mesnajes al mismo tiempo cuando responda el Response, no tendras mensajes intermedios

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 24 de enero de 2020 20:05
  • Hola,

    gracias por vuestras respuestas y ayuda.

    Al final lo he resuelto con Ajax.

    aviso("Instalando la aplicación...<br>por favor, espera...<br><br>No cierres el navegador<br><br><img src='../images/loading.gif' width='50'>"
    + "<div id='dvInstInfo' style='padding-'><img src='../images/loading.gif' width='16'> Verificando la conexión con el servidor de configuración...</div>");
    $.ajax({
    type: "POST",
    url: "./elAjax/sqlServer.aspx/VerificarConfServer",
    data: '{ "ConfServer":"' + ConfServer + '", "ConfUsuario":"' + ConfUsuario + '", "ConfPswrd":"'+ConfPswrd+'"}',
    contentType: "application/json; charset=utf-8",
    dataType: "json", success: function (response) {
    if (!response.d) { $("#dvVeloCont").html("Error! No se ha podido conectar con el servidor "+ConfServer); }
    },
    failure: function (response) { alert(response.d); }
    });

    Saludos,


    Ely Jené

    miércoles, 29 de enero de 2020 6:58