none
Tarea programada consumiendo web service RRS feed

  • Pregunta

  • Buenas tardes a Toda la comunidad

    El problema que tengo es que realmente no se si se puede hacer una tarea programada en Visual C# que consuma un WebService y que a la vez se concecte a una base de datos en diferentes servidores, si en caso de que se pueda realizar estaria muy agradecido por su ayuda en que me mostraran algun manual o web donde poder guiarme.

    Se que las tareas programadas se hacen siguiendo el ejempo que esta en http://www.codeproject.com/KB/cs/tsnewlib.aspx

    De antemano muchas gracias por su tiempo y ayuda.


    SrKuen® srkuen® Srkuen® srKuen® Sr Kuen® Sr. Kuen® Sr. kuen® sr. Kuen® sr. kuen® sr kuen® Sr kuen® sr Kuen® Sr Kuen®
    lunes, 25 de octubre de 2010 22:39

Respuestas

  • Yo lo abordaría de otra forma un poco diferente y luego iría evolucionando la aplicación :

    1.- Creo una aplicación de consola que invoque el Web Service, y haga los trabajos requeridos sobre la base de datos, una vez que funcione cada vez que lo mando a ejecutar, bueno, ya sabemos que funciona....

    2.- Puedo crear una tarea en el programador de tareas de Windows y hacer que llame a la aplicación cada N minutos (aplicación que ya se que funciona).

    3.- Ya en esta etapa, podemos pensar en crear una aplicación de tipo servicio a la cual le adiciona la funcionalidad ya probada y funcionando.

     

    Cordial saludo,

     


    Mauricio Atanache G. - MCP
    Bogotá - Colombia
    "Bienaventurados los Pesimistas. Por que hacen BACKUPS."
    miércoles, 27 de octubre de 2010 23:01

Todas las respuestas

  • hola

    particulrmente lo encararia mas por este lado:

    Combine Web and Windows Services to Run Your ASP.NET Code at Scheduled Intervals

     

    como veras en el articulo se crea un Servicio de Windows, en el cual por medio de un timer, se lanza las tareas, tambien cuanta con uan base de datos y en la tabla se definen los Jobs

    seria la forma en que yo resolveria el problema

    por supuesto necesitaras luego de una pc en el cliente para instaalr este servicio de windows que actuara como Scheduler de las tareas y sera el encargado de conectarse al web service

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 26 de octubre de 2010 0:38
  • Una tarea programada puede ser una aplicación de consola!!! un dll por ejemplo  básicamete es esto: Tareas programadas. Ahora bien si necesitas referenciar un WebService, simplemete lo debes hacer como se hace en cualquier otra aplicación, Referencia a Web Service. Luego deberias construir una aplicación orientada a capas que al fin y al cabo son otras dlls , hablo de capa de negocio, capa de datos para poder impactar una base de datos y una capa de servicios(WebService) entonces deberias mirar esto: 3- Capas como veras es un compendio de temas los que deberias revisar. la tarea programada es lo de menos, lo importante es tener la dll o el exe funcionando, para esto te sugiero Empieces por aplicaciones en 3 capas o N capas segun se adapte a lo que quieras por que luego podrías pensar en una capa de presentación o depronto hasta ya la tendras. Teniendo esto ya será mas fácil configurar la tarea debido a que es simplemente paramatrizar la dll o el exe para que se ejecute cada cierto tiempo.

    Saludos espero encuentres una visión un poco más amplia en cada uno de los links Saludos!!!!


    Coding "La lucha diaria" - D3S........D4S
    "Ya tengo Blog :D": Nueva Entrada Silverlight
    martes, 26 de octubre de 2010 3:42
  • Saludos a toda la comunidad

    Muchas gracias por sus respuestas y tiempo.

    Con respecto a Leandro voy a leer el link que me has dejado para ver que puedo sacar, en un principio estaba haciendo un Windows Service pero me dijeron que no lo querian de esa forma sino que debia ser una tarea programada, pero gracias por la ayuda.

    La parte de Felipe es buena, es información muy util, y tambien vere que puedo extraer de ella, aunque algunas de esos links lo habia leido, pero te doy las gracias por tu tiempo y ayuda.

    Es una buena idea lo de hacer un dll o exe para despues solo hacer una tarea programada en el servido y lo mande a llamar, voy a investigar.

    Lo que he estado leyendo es esto (aunque avanzo lento porque me cuesta un poco el ingles):

    http://www.codeproject.com/KB/cs/tsnewlib.aspx

    http://www.15seconds.com/issue/031124.htm

    En caso contrario de que este equivocado me pueden ayudar con alguna otra informacion o ideas de como hacerlo mejor.

    Saludos y gracias.

    SrKuen® srkuen® Srkuen® srKuen® Sr Kuen® Sr. Kuen® Sr. kuen® sr. Kuen® sr. kuen® sr kuen® Sr kuen® sr Kuen® Sr Kuen®
    martes, 26 de octubre de 2010 18:21
  • Saludos a toda la comunidad

    Pues cambie la forma de hacer el proyecto y lo realice como un servicio de windows (WinService) consumiendo un WebService, al ejecutar el servicio no me genera lo que quiero, bueno el servicio corre pero no hace nada, aparte no se si se conecta a la base de datos, no sé si me pueden ayudar con el código a ver si tengo algo mal escrito, el código es el siguiente:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    using System.Data.SqlClient;
    using System.IO;
    using System.Timers;
    using System.Xml;
    using System.Configuration;
    using wsl = WinServiceBajaEmpleado.WRLogin;
    using wsr = WinServiceBajaEmpleado.WRInsert;
    
    namespace WinServiceBajaEmpleado
    {
      public partial class Service1 : ServiceBase
      {
        private Timer myTimer;
        private SqlConnection cnn;
        private SqlCommand com1;
        private SqlDataAdapter da1;
        private DataTable dt1;
        private DataRow dr1;
        private string usuario;
        private string password;
        private string Description;
        private string FlowID;
        private string Comment;
        private string error;
        private string[,] usuariosdebaja;
        private int w;
        private int RequerimentID = 0;
        private int userid;
        private int CurrentUser;
    
        public Service1()
        {
          InitializeComponent();
        }
    
        protected override void OnStart(string[] args)
        {
          //Timer para el control del tiempo entre llamadas.
          myTimer = new Timer();
    
          //Intervalo de tiempo entre llamadas. 
          //myTimer.Interval = 180000;//3 min 
          //myTimer.Interval = 86400000;//24 horas
          myTimer.Interval = 30000; //30 segundos
    
          //Evento a ejecutar cuando se cumple el tiempo.  
          myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);
    
          //Habilitar el Timer. 
          myTimer.Enabled = true;
        }
    
        protected override void OnStop()
        {
        }
    
        void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
          //Detiene el Timer 
          myTimer.Enabled = false;
    
          //Ejecuta la actualizacion de la Base de Datos 
          PasarDatosWebServiceRequestTracker();
    
          //habilita el Timer nuevamente. 
          myTimer.Enabled = true;
        }
    
        void PasarDatosWebServiceRequestTracker()
        {
          usuariosdebaja = extraerusuariodadosdebaja();
    
          if (usuariosdebaja[0, 0] != "0")
          {
            for (int j = 0; j < w; j++)
            {
    
              usuario = "1900001";
              password = "jtlWltuc5KNRUmhYrPjGW5CwFl8=";
              FlowID = "RRHH03";
    
              //UserID de SAN del usuario que ingresa RT
              userid = 2383;
    
              //UserID de SAN del usuario que se le asigna el RT en el flujo
              CurrentUser = 672;
    
              //Descripcion del usuario dado de baja
              Description = usuariosdebaja[j, 0] + " " + usuariosdebaja[j, 1] + ", " + usuariosdebaja[j, 2];
    
              //Comentario a ser ingresado en el RT
              Comment = "El empleado cuyo código es " + usuariosdebaja[j, 0] + " con nombre " +
                usuariosdebaja[j, 1] + ", " + usuariosdebaja[j, 2] + " con el cargo " + usuariosdebaja[j, 3] +
                " del departamento " + usuariosdebaja[j, 4] + " y pertenece a " + usuariosdebaja[j, 5] +
                " ha sido retirado del banco a partir de la fecha " + usuariosdebaja[j, 7] +
                ", por lo que se solicita hacer efectiva la inactivación del usuario en la red y de los" +
                " sistemas y la cuenta de correo la cual es: " + usuariosdebaja[j, 6] +
                " a partir de la fecha indicada, el usuario que autorizo la baja es : " + usuariosdebaja[j, 8];
    
              //Declarando el WebService
              wsr.WSInsert rs = new wsr.WSInsert();
    
              //Consumiendo el WebService Insertar el requerimiento en RT
              RequerimentID = rs.InsertRequeriment("Baja de empleado: " + Description, userid, FlowID, "", 1, CurrentUser);
    
              //Se verifica si se genero el requerimiento
              if (RequerimentID != 0)
              {
                //Insertar comentario en el RT
                rs.InsertComment(RequerimentID, userid, Comment, "");
    
                //Actualizar el campo RET_NOTIFICACION de la tabla PLA_RET_RETIROS en VHUR_PROCREDIT cuando se pudo ingresar un RT
                actualizarnotificacionderetiro(userid, 0);
              }
              else
              {
                //Actualizar el campo RET_NOTIFICACION de la tabla PLA_RET_RETIROS en VHUR_PROCREDIT cuando no se pudo ingresar un RT
                actualizarnotificacionderetiro(userid, 1);
              }
            }
          }
        }
    
        public void actualizarnotificacionderetiro(int usuario, int estado1)
        {
          cnn = new SqlConnection();
          string vs1 = "Data Source=itdev111;Initial Catalog=VHUR_PROCREDIT;User ID=sa;Password=1234567890";
    
          try
          {
            cnn = new SqlConnection(vs1);
            cnn.Open();
            com1 = new SqlCommand();
            com1.Connection = cnn;
            com1.CommandType = System.Data.CommandType.StoredProcedure;
            com1.CommandText = "dalPLA_RET_RETIROSUpdateRET_NOTIFICACION";
            SqlParameter codemp = new SqlParameter();
            codemp.ParameterName = "@codemp";
            codemp.SqlDbType = SqlDbType.Int;
            codemp.Value = usuario;
            com1.Parameters.Add(codemp);
            SqlParameter estado = new SqlParameter();
            estado.ParameterName = "@estado";
            estado.SqlDbType = SqlDbType.Bit;
            estado.Value = estado1;
            com1.Parameters.Add(estado);
            com1.ExecuteNonQuery();
          }
          catch (Exception ex)
          {
            EventLog.WriteEntry("PingTest Service", ex.Message, EventLogEntryType.Warning);
            error = ex.Source.ToString();
          }
        }
    
        public string[,] extraerusuariodadosdebaja()
        {
          cnn = new SqlConnection();
          string vs1 = "Data Source=itdev111;Initial Catalog=VHUR_PROCREDIT;User ID=sa;Password=1234567890";
          string[,] usuarios;
    
          try
          {
            cnn = new SqlConnection(vs1);
            cnn.Open();
            com1 = new SqlCommand();
            com1.Connection = cnn;
            com1.CommandType = System.Data.CommandType.StoredProcedure;
            com1.CommandText = "dalPLA_RET_RETIROSSelectRET_CODEMPByRET_FCH_AUTORIZA";
            da1 = new SqlDataAdapter(com1);
            dt1 = new DataTable();
            da1.Fill(dt1);
            if (dt1.Columns.Count > 0)
            {
              w = dt1.Columns.Count;
              usuarios = new string[w, 9];
              usuariosdebaja = new string[w, 9];
            }
            else
            {
              w = 0;
              usuarios = new string[0, 9];
              usuariosdebaja = new string[0, 9];
              usuariosdebaja[0, 0] = "0";
            }
            
            if (dt1.Rows.Count > 0)
            {
              for (int i = 0; i < w; i++)
              {
                dr1 = dt1.Rows[i];
                usuarios[i, 0] = dr1["CODIGO"].ToString();
                usuarios[i, 1] = dr1["APELLIDOS"].ToString();
                usuarios[i, 2] = dr1["NOMBRES"].ToString();
                usuarios[i, 3] = dr1["CARGO"].ToString();
                usuarios[i, 4] = dr1["AREA"].ToString();
                usuarios[i, 5] = dr1["UBICACION"].ToString();
                usuarios[i, 6] = dr1["CORREO"].ToString();
                usuarios[i, 7] = dr1["FECHARETI"].ToString();
                usuarios[i, 8] = dr1["AUTORIZA"].ToString();
              }
            }
            return usuarios;
          }
          catch (Exception ex)
          {
            EventLog.WriteEntry("PingTest Service", ex.Message, EventLogEntryType.Warning);
            error = ex.Source.ToString();
            return null;
          }
        }
      }
    }
    
    

     

    De antemano muchas gracias por su ayuda y tiempo.


    SrKuen® srkuen® Srkuen® srKuen® Sr Kuen® Sr. Kuen® Sr. kuen® sr. Kuen® sr. kuen® sr kuen® Sr kuen® sr Kuen® Sr Kuen®
    miércoles, 27 de octubre de 2010 22:47
  • Yo lo abordaría de otra forma un poco diferente y luego iría evolucionando la aplicación :

    1.- Creo una aplicación de consola que invoque el Web Service, y haga los trabajos requeridos sobre la base de datos, una vez que funcione cada vez que lo mando a ejecutar, bueno, ya sabemos que funciona....

    2.- Puedo crear una tarea en el programador de tareas de Windows y hacer que llame a la aplicación cada N minutos (aplicación que ya se que funciona).

    3.- Ya en esta etapa, podemos pensar en crear una aplicación de tipo servicio a la cual le adiciona la funcionalidad ya probada y funcionando.

     

    Cordial saludo,

     


    Mauricio Atanache G. - MCP
    Bogotá - Colombia
    "Bienaventurados los Pesimistas. Por que hacen BACKUPS."
    miércoles, 27 de octubre de 2010 23:01
  • Hola

    ¿Fue posible solucionar su problema?

    Saludos
    Eduardo Portescheller
    jueves, 28 de octubre de 2010 14:24
    Moderador
  • Saludos a toda la comunidad

    Gracias a Mauricio Atanache y Eduardo Portescheller por sus respuestas.

    Ya me funciona el programa, lo hice como un WinService con referencia a un WebService y se conecta a una base de datos, tenia ciertos errores los cuales eran que no tenia las referencias indicadas tanto a nivel del Explorador de Soluciones como en el código, el código me quedo de la siguiente manera:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    using System.Data.SqlClient;
    using System.IO;
    using System.Timers;
    using System.Xml;
    using System.Configuration;
    using System.Web;
    using System.Web.UI;
    using System.Web.Security;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using wsl = WinServiceBajaEmpleado.WRLogin;
    using wsr = WinServiceBajaEmpleado.WRInsert;
    
    namespace WinServiceBajaEmpleado
    {
      public partial class Service1 : ServiceBase
      {
        System.Timers.Timer myTimer;
    
        private SqlConnection cnn;
        private SqlCommand com1;
        private SqlDataAdapter da1;
        private DataTable dt1;
        private DataRow dr1;
    
        private string Description;
        private string FlowID;
        private string Comment;
        private string error;
        private string[,] usuariosdebaja;
        private int w;
        private int RequerimentID = 0;
        private int userid;
        private int CurrentUser;
    
        public Service1()
        {
          InitializeComponent();
        }
    
        protected override void OnStart(string[] args)
        {
          //Timer para el control del tiempo entre llamadas.
          myTimer = new System.Timers.Timer();
    
          //Intervalo de tiempo entre llamadas. 
          //myTimer.Interval = 180000 --> 3 minutos // 86400000 --> 24 horas
          myTimer.Interval = 10000; //30 segundos
    
          //Evento a ejecutar cuando se cumple el tiempo.  
          myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);
    
          //Habilitar el Timer.
          myTimer.Enabled = true;
        }
    
        protected override void OnStop()
        {
    
        }
    
        void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
          //Detiene el Timer 
          myTimer.Enabled = false;
          
          //Ejecuta la actualizacion de la Base de Datos 
          PasarDatosWebServiceRequestTracker();
    
          //habilita el Timer nuevamente. 
          myTimer.Enabled = true;
        }
    
        void PasarDatosWebServiceRequestTracker()
        {
          //Buscar los usuarios que se han dado de baja
          usuariosdebaja = extraerusuariodadosdebaja();
    
          //Se verifica si han habido bajas
          if (usuariosdebaja[0, 0] != "0")
          {
            for (int j = 0; j < w; j++)
            {
              //Flujo del RT a ingresar "Desactivación de usuarios"
              FlowID = "RRHH03";
    
              //UserID del usuario que ingresa RT
              userid = 2383;
    
              //Descripcion del usuario dado de baja
              Description = usuariosdebaja[j, 0] + " " + usuariosdebaja[j, 1] + ", " + usuariosdebaja[j, 2];
    
              //Comentario a ser ingresado en el RT
              Comment = "El empleado cuyo código es " + usuariosdebaja[j, 0] + " con nombre " +
                usuariosdebaja[j, 1] + ", " + usuariosdebaja[j, 2] + " con el cargo " + usuariosdebaja[j, 3] +
                " del departamento " + usuariosdebaja[j, 4] + " y pertenece a " + usuariosdebaja[j, 5] +
                " ha sido retirado del banco a partir de la fecha " + usuariosdebaja[j, 7] +
                ", por lo que se solicita hacer efectiva la inactivación del usuario en la red y de los" +
                " sistemas y la cuenta de correo la cual es: " + usuariosdebaja[j, 6] +
                " a partir de la fecha indicada, el usuario que autorizo la baja es : " + usuariosdebaja[j, 8];
    
              //Declarando el WebService
              wsr.WSInsert rs = new wsr.WSInsert();
    
              //UserID del usuario que se le asigna el RT en el flujo
              CurrentUser = rs.GetUser(FlowID);
    
              //Consumiendo el WebService Insertar el requerimiento en RT
              RequerimentID = rs.InsertRequeriment("Baja de empleado: " + Description, userid, FlowID, "", 1, CurrentUser);
    
              //Se verifica si se genero el requerimiento
              if (RequerimentID != 0)
              {
                //Insertar comentario en el RT
                rs.InsertComment(RequerimentID, userid, Comment, "");
    
                //Actualizar el campo RET_NOTIFICACION de la tabla PLA_RET_RETIROS
                //cuando se pudo ingresar un RT
                actualizarnotificacionderetiro(userid, 1);
              }
              else
              {
                //Actualizar el campo RET_NOTIFICACION de la tabla PLA_RET_RETIRO
                //cuando no se pudo ingresar un RT
                actualizarnotificacionderetiro(userid, 0);
              }
            }
          }
        }
    
        public void actualizarnotificacionderetiro(int usuario, int estado1)
        {
          cnn = new SqlConnection();
          string vs1 = "Data Source=abcdef;Initial Catalog=VHUR;User ID=xxxx;Password=123456789";
          string[,] usuarios;
    
          try
          {
            cnn = new SqlConnection(vs1);
            cnn.Open();
            com1 = new SqlCommand();
            com1.Connection = cnn;
            com1.CommandType = System.Data.CommandType.StoredProcedure;
            com1.CommandText = "dalPLA_RET_RETIROSUpdateRET_NOTIFICACION";
            SqlParameter codemp = new SqlParameter();
            codemp.ParameterName = "@codemp";
            codemp.SqlDbType = SqlDbType.Int;
            codemp.Value = usuario;
            com1.Parameters.Add(codemp);
            SqlParameter estado = new SqlParameter();
            estado.ParameterName = "@estado";
            estado.SqlDbType = SqlDbType.Bit;
            estado.Value = estado1;
            com1.Parameters.Add(estado);
            com1.ExecuteNonQuery();
          }
          catch (Exception ex)
          {
            error = ex.Source.ToString();
          }
        }
    
        public string[,] extraerusuariodadosdebaja()
        {
          cnn = new SqlConnection();
          string vs1 = "Data Source=abcdef;Initial Catalog=VHUR;User ID=xxxx;Password=123456789";
          string[,] usuarios;
    
          try
          {
            cnn = new SqlConnection(vs1);
            cnn.Open();
            com1 = new SqlCommand();
            com1.Connection = cnn;
            com1.CommandType = System.Data.CommandType.StoredProcedure;
            com1.CommandText = "dalPLA_RET_RETIROSSelectRET_CODEMPByRET_FCH_AUTORIZA";
            da1 = new SqlDataAdapter(com1);
            dt1 = new DataTable();
            da1.Fill(dt1);
            if (dt1.Rows.Count > 0)
            {
              w = dt1.Rows.Count;
              usuarios = new string[w, 9];
              usuariosdebaja = new string[w, 9];
            }
            else
            {
              w = 0;
              usuarios = new string[0, 9];
              usuariosdebaja = new string[0, 9];
              usuariosdebaja[0, 0] = "0";
            }
            if (dt1.Rows.Count > 0)
            {
              for (int i = 0; i < w; i++)
              {
                dr1 = dt1.Rows[i];
                usuarios[i, 0] = dr1["CODIGO"].ToString();
                usuarios[i, 1] = dr1["APELLIDOS"].ToString();
                usuarios[i, 2] = dr1["NOMBRES"].ToString();
                usuarios[i, 3] = dr1["CARGO"].ToString();
                usuarios[i, 4] = dr1["AREA"].ToString();
                usuarios[i, 5] = dr1["UBICACION"].ToString();
                usuarios[i, 6] = dr1["CORREO"].ToString();
                usuarios[i, 7] = dr1["FECHARETI"].ToString();
                usuarios[i, 8] = dr1["AUTORIZA"].ToString();
              }
            }
            return usuarios;
          }
          catch (Exception ex)
          {
            error = ex.Source.ToString();
            return null;
          }
        }
      }
    }
    
    

    Saludos a toda la comunidad.


    SrKuen® srkuen® Srkuen® srKuen® Sr Kuen® Sr. Kuen® Sr. kuen® sr. Kuen® sr. kuen® sr kuen® Sr kuen® sr Kuen® Sr Kuen®
    jueves, 28 de octubre de 2010 18:38