none
Instanciar clase en WebMethod RRS feed

  • Pregunta

  • Estimados

          Junto con saludar y agradecer al foro por sus respuestas, mi consulta es como instanciar mi clase en mi WebMethod para poder realizar las acciones a nivel de carpetas.

    Este es mi web metod

    [WebMethod]
            public DataSet Cliente (string rut)
            {
                copyTable ct = new copyTable();
                ct.Copy();

                string var = "\"" + rut + "%\"";

                string cadenaCnn = @"Provider=vfpoledb;Data Source=D:\Users\Nicolas\Documents\BPT\ProyectoBPT\Laudus\Empresas\BPT;Collating Sequence=general;";
                //string cadenaCnn = "Provider=vfpoledb;Data Source=C:\\laudus;Collating Sequence=general;";
                //string cadenaCnn = @"Provider=vfpoledb;Data Source=C:\laudus;Collating Sequence=general;";
                //string consultaVFP = "SELECT Clientes.idcliente, Clientes.idtipo, Clientes.idvendedor, Clientes.iddealer, Clientes.nombre, Clientes.dirección as direccion, Clientes.comuna, Clientes.cp, Clientes.ciudad, Clientes.región as region, Clientes.país as pais, Clientes.countrycode, Clientes.teléfono as telefono, Clientes.teléfono2 as telefono2, Clientes.fax, Clientes.email, Clientes.dte_email, Clientes.webpage, Clientes.idpricel, Clientes.descuento, Clientes.discountisadditive, Clientes.plazopago, Clientes.idformapag, Clientes.notas, Clientes.idcuenta, Clientes.creditlimit, Clientes.rut, Clientes.dígitoverificación as dgv, Clientes.vatid, Clientes.razónsocial, Clientes.direcciónfacturación as direccionfacturacion, Clientes.comunafacturación as comunafacturacion, Clientes.cpfacturación as cpfacturacion, Clientes.ciudadfacturación as ciudadfacturacion, Clientes.paísfacturación as paisfacturacion, Clientes.countrycode_invoicing, Clientes.giro, Clientes.horario, Clientes.díacobro as diacobro, Clientes.defaultquoteheader, Clientes.defaultquotefooter, Clientes.blocked, Clientes.blocked_exceedcreditlimit, Clientes.blocked_overdueinvoices, Clientes.foreigner, Clientes.createdby, Clientes.createdon, Clientes.modifiedby,  Clientes.modifiedon, Clientes.comercionet_code, Clientes.separador, Clientes.extranet_username, Clientes.extranet_password, Clientes.extranet_allowaccess FROM EMPRESA!CLIENTES CLIENTES WHERE (AT('" + rut + "', ALLTRIM(STR(CLIENTES.RUT)))>0)";
                string consultaVFP = "SELECT Clientes.idcliente, Clientes.idtipo, Clientes.idvendedor, Clientes.iddealer, Clientes.nombre, Clientes.dirección as direccion, Clientes.comuna, Clientes.cp, Clientes.ciudad, Clientes.región as region, Clientes.país as pais, Clientes.countrycode, Clientes.teléfono as telefono, Clientes.teléfono2 as telefono2, Clientes.fax, Clientes.email, Clientes.dte_email, Clientes.webpage, Clientes.idpricel, Clientes.descuento, Clientes.discountisadditive, Clientes.plazopago, Clientes.idformapag, Clientes.notas, Clientes.idcuenta, Clientes.creditlimit, Clientes.rut, Clientes.dígitoverificación as dgv, Clientes.vatid, Clientes.razónsocial, Clientes.direcciónfacturación as direccionfacturacion, Clientes.comunafacturación as comunafacturacion, Clientes.cpfacturación as cpfacturacion, Clientes.ciudadfacturación as ciudadfacturacion, Clientes.paísfacturación as paisfacturacion, Clientes.countrycode_invoicing, Clientes.giro, Clientes.horario, Clientes.díacobro as diacobro, Clientes.defaultquoteheader, Clientes.defaultquotefooter, Clientes.blocked, Clientes.blocked_exceedcreditlimit, Clientes.blocked_overdueinvoices, Clientes.foreigner, Clientes.createdby, Clientes.createdon, Clientes.modifiedby,  Clientes.modifiedon, Clientes.comercionet_code, Clientes.separador, Clientes.extranet_username, Clientes.extranet_password, Clientes.extranet_allowaccess FROM EMPRESA!CLIENTES CLIENTES WHERE TRANSFORM(Clientes.rut) like "+var+" ";

                using (System.Data.OleDb.OleDbConnection cnn = new System.Data.OleDb.OleDbConnection(cadenaCnn))
                {
                    cnn.Open();
                    System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(consultaVFP, cnn);
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    return ds;
                }
            }

                         

    La clase es la siguiente:

    public class copyTable:System.Web.UI.Page
        {
            public void Copy()
            {
                string archivo = "prueba.txt";
                string carpetaOrigen = @"D:\Prueba\Carpeta origen";
                string carpetaDestino = @"D:\Prueba\Carpeta destino";
    
                string origen = System.IO.Path.Combine(carpetaOrigen, archivo);
    
                if (!System.IO.Directory.Exists(carpetaDestino))
                {
                    System.IO.Directory.CreateDirectory(carpetaDestino);
                    //System.IO.File.Copy(archivo, carpetaDestino, true);
                    //System.IO.File.Copy(archivo, carpetaDestino, true);
                    //System.IO.File.Copy(archivo, carpetaDestino, true);
                    //System.IO.File.Copy(archivo, carpetaDestino, true);
                    //System.IO.File.Copy(archivo, carpetaDestino, true);
                }
                else
                {
                    System.IO.File.Copy(archivo, carpetaDestino, true);
                }
            }
        }
    Al ser llamado mi WebMethod este no ejecuta la clase que instancie para copiar los archivos de una carpeta origen a la carpeta destino. Es posible poder contar con su ayuda para este problema.
    martes, 21 de agosto de 2018 18:14

Respuestas

  • La instanciación y la llamada a la clase desde el WebMethod están bien, es decir, es correcto esto que has escrito:

                copyTable ct = new copyTable();
                ct.Copy();

    Sin embargo, veo algunos problemas dentro de la propia clase:

    - No tiene sentido heredar de System.Web.UI.Page, la clase no usa nada de dicha clase madre.

    - El "If" crea el directorio si no existe, y a continuación no hace nada con él. Únicamente copia el archivo si el directorio ya existe.

    - El File.Copy no tiene escrito el nombre de archivo de destino, solo tiene puesta una carpeta como destino. A diferencia del COPY de línea de comandos, que entiende que el nombre de archivo de destino es el mismo que el origen si el destino es una carpeta, el comando File.Copy no tiene ese comportamiento predeterminado. Es necesario poner el nombre de archivo.

    martes, 21 de agosto de 2018 18:23
    Moderador
  • hola

    entiendo que el webmethod esta dentro de copyTable, no?

    si es asi recuerda que debes definirlo como static

    public static DataSet Cliente (string rut)

    Ademas no recomendaria devuelvas un datatable, retorna una lista de una clase que tu definas, si es una clase Cliente, entonces sera List<Cliente> lo que devuelvas como respuesta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 21 de agosto de 2018 19:54

Todas las respuestas

  • La instanciación y la llamada a la clase desde el WebMethod están bien, es decir, es correcto esto que has escrito:

                copyTable ct = new copyTable();
                ct.Copy();

    Sin embargo, veo algunos problemas dentro de la propia clase:

    - No tiene sentido heredar de System.Web.UI.Page, la clase no usa nada de dicha clase madre.

    - El "If" crea el directorio si no existe, y a continuación no hace nada con él. Únicamente copia el archivo si el directorio ya existe.

    - El File.Copy no tiene escrito el nombre de archivo de destino, solo tiene puesta una carpeta como destino. A diferencia del COPY de línea de comandos, que entiende que el nombre de archivo de destino es el mismo que el origen si el destino es una carpeta, el comando File.Copy no tiene ese comportamiento predeterminado. Es necesario poner el nombre de archivo.

    martes, 21 de agosto de 2018 18:23
    Moderador
  • Gracias Alberto, tienes razon sobre el codigo de mi clase ya que en estos minutos la estuve revisando y fue mi error el generar dicha clase sin muchos fundamentos... y es lo que me producia problemas.

    Ahora sobre una consulta ya que no me manejo en este tema de heredar un clase ya que he visto que muchos en la red lo utilizan y francamente no tengo mucho conocimiento de este punto.

    martes, 21 de agosto de 2018 19:07
  • hola

    entiendo que el webmethod esta dentro de copyTable, no?

    si es asi recuerda que debes definirlo como static

    public static DataSet Cliente (string rut)

    Ademas no recomendaria devuelvas un datatable, retorna una lista de una clase que tu definas, si es una clase Cliente, entonces sera List<Cliente> lo que devuelvas como respuesta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 21 de agosto de 2018 19:54