miércoles, 29 de noviembre de 2017

C# - JQuery Carga Pagina con evento jutils ajax

Al tener un sitio Jquery publicado en IIS con un evento jutils.ajax que cargue al principio, se puede dar el siguiente error:


Esto ocurre porque la libreria jutils.ajax va a buscar el método con la URL de la página, url que de momento no encuentra, por este motivo vamos a forzar el llamado del metodo pasandole la URL, de forma dinámica:


De esta forma , la aplicación sabe si ir al Post forzado, o al Post normal






Acá el codigo para ser copiado:
  function loadComboEmpresas() {
            try {
                var id = "0";
                var wsparams = "{'a':'" + id + "'}";

                var url = window.location.href;
                if (url.indexOf('Paginas') > 0) {
                    jutils.ajax.loadCombo('SelEmpresas', wsparams, 'cmbEmpresas', 'cod_empresa', 'rut_completo');
                } else {
                    jutils.ajax.loadCombo('Paginas/GenDatosContri.aspx/SelEmpresas', wsparams, 'cmbEmpresas', 'cod_empresa', 'rut_completo');
                }
            } catch (e) {
                showMessage(e.message);
            }
        }
ACTUALIZACIÓN: Si la pagina tiene mas de un metodo AJAX, tal vez convenga recargar la url directamente en el navegador -->
  <script type="text/javascript">
        $(document).ready(function () {
            var url = window.location.href;
            if (url.indexOf('Paginas') > 0) {
            } else {
                var urlDinamica = url + "Paginas/GenDatosContri.aspx";
                window.location.replace(urlDinamica);
            }
            defineGrid();
            loadComboEmpresas();
        });
.......

martes, 21 de noviembre de 2017

C# - Leer contenido de una página externa desde .NET

-------------------------------------------------------------
Usando la dll --> HtmlAgilityPack.dll
-------------------------------------------------------------

Hay varias recetas y métodos  en internet para leer y descargar sitios web y poder manipularlos desde .NET, por lo que pude leer el sitio sin problemas, sin embargo la información que realmente necesitaba estaba contenida en la página dentro de un IFRAME que se carga en ejecución.

A través del "inspecionar" de Google Chrome llegué al nombre del IFRAME, sin embargo no podía acceder al contenido porque la llamada era "POST" y no por URL por ende no tenia la menor idea de cuales eran los paramétros necesarios para activar el iframe, gracias a un amigo que también es informático Sebastián Coppia (https://doreancl.blogspot.cl/) pude llegar a los parámetros del método, otra vez con Google Chrome, acá muestro como:







-----------------------------------------------------------------------------------------------------------
El resto es historia conocida:
-----------------------------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
using System.Web;
using Contribuciones.Paginas;
using HtmlAgilityPack;

namespace Contribuciones.Utils
{
    public class Respuesta
    {
        public Exception Error = null;
        public string ErrMsg = string.Empty;
        public List<DetalleEnvio> lstDetalleEnvios;
    }

    public struct DetalleEnvio
    {
        public string EstadoEnvio;
        public string Fecha;
        public string Oficina;
    }

    public class ConsultaCorreosChile
    {
        /// <summary>
        /// ObtieneDetalleEnviosCorreo Trae el listado de Detalle de Envio de correo
        /// </summary>
        /// <param name="numEnvio"></param>
        /// <returns></returns>
        public static Respuesta ObtieneDetalleEnviosCorreo(string numEnvio)
        {
            Respuesta respuesta = new Respuesta();

            try
            {
                ConsultaCorreosChile consultaCorreosChile = new ConsultaCorreosChile();
                string html = consultaCorreosChile.ConnectCorreosChile(numEnvio);

                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(html);

                List<DetalleEnvio> lstDetalleEnvios = consultaCorreosChile.GetEstadoEnvio(doc);
                respuesta.lstDetalleEnvios = lstDetalleEnvios;
            }
            catch (Exception ex)
            {
                respuesta.ErrMsg = ex.Message;
                respuesta.Error = ex;
            }
            return respuesta;
        }

        /// <summary>
        ///ConnectCorreosChile Extrae informacion desde Iframe de Correos de Chile
        /// </summary>
        /// <param name="numEnvio">Nº de Envío a consultar</param>
        /// <returns></returns>
        private string ConnectCorreosChile(string numEnvio)
        {
            var data = new NameValueCollection();
            data["obj_key"] = "Cor398-cc";
            data["obj_env"] = numEnvio.Trim();

            var wb = new WebClient();
            wb.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
            string url = "http://seguimientoweb.correos.cl/ConEnvCorreos.aspx";

            var bytes = wb.UploadValues(url, "POST", data);

            var response = System.Text.UTF8Encoding.UTF8.GetString(bytes);
            string decodeResponse = HttpUtility.UrlDecode(response, System.Text.Encoding.Default);

            string replacement = Regex.Replace(decodeResponse, @"\t|\n|\r|", "");

            replacement = replacement.Replace(@"\", "");
            return replacement;

        }

        /// <summary>
        /// GetEstadoEnvio Obtiene a traves de desgloce de html los estados y llena la clase y listado.-
        /// </summary>
        /// <param name="doc"></param>
        /// <returns></returns>
        private List<DetalleEnvio> GetEstadoEnvio(HtmlDocument doc)
        {
            List<DetalleEnvio> lstEstados = new List<DetalleEnvio>();

            if (doc.DocumentNode.SelectSingleNode("//text()[contains(., 'ESTADO DEL ENVIO')]") != null)
            {
                HtmlDocument estados = new HtmlDocument();

                estados.LoadHtml(doc.DocumentNode.SelectNodes("//table[@class='tracking']")[0].OuterHtml);

                for (int i = 1; i < estados.DocumentNode.SelectNodes(".//tr").Count; i++) // i=1 --> para que no tome los encabezados
                {
                    HtmlNode rowVigente = estados.DocumentNode.SelectNodes(".//tr")[i];
                    DetalleEnvio detalle = new DetalleEnvio();

                    detalle.EstadoEnvio = rowVigente.SelectNodes(".//td")[0].InnerText.Replace("&nbsp;","").Trim();
                    detalle.Fecha = rowVigente.SelectNodes(".//td")[1].InnerText.Trim().Replace("&nbsp;", "").Trim();
                    detalle.Oficina = rowVigente.SelectNodes(".//td")[2].InnerText.Trim().Replace("&nbsp;", "").Trim();

                    lstEstados.Add(detalle);
                }
            }
            return lstEstados;
        }
    }
}



-----------------------------------------------------------------------------------------------------------
Y dejo por aca el contenido del Iframe para que se hagan una idea de como lo recorro
para obtener los datos:
-----------------------------------------------------------------------------------------------------------
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>
CorreosChile - Seguimiento de Envios
</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><link rel="stylesheet" href="Style/Style.css" type="text/css" /></head>
<body>
   <body>
        <form method="post" action="ConEnvCorreos.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNTE2MzM1NDU1ZGRn1MgG5Rx6zmHY/xWZIJPQFvCOWaDouApFBzTic8IDSw==" />
</div>

<div class="aspNetHidden">

<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="DF4A8937" />
</div>
   
 

<div id="pnlEnvio">

 
    <div id="Panel_Entrega">

        <font class="titulo">Datos de la entrega</font>
        <br>
        <br>
        <table class="datosgenerales">
            <tr height="30px">
                <td width="95px"  class="generalTitulo">&nbsp;&nbsp;Envio</td>
                <td width="200px" bgcolor="#F8F8F8"    >&nbsp;&nbsp;1170115050593&nbsp;</td>
                <td width="95px"  class="generalTitulo">&nbsp;&nbsp;Entregado a</td>
                <td bgcolor="#F8F8F8"                  >&nbsp;&nbsp;&nbsp;</td>
            </tr>
            <tr height="30px">
                <td width="95px"  class="generalTitulo">&nbsp;&nbsp;Fecha Entrega</td>
                <td width="200px" bgcolor="#F8F8F8"    >&nbsp;&nbsp;26/07/2017 13:25&nbsp;</td>
                <td width="95px"  class="generalTitulo">&nbsp;&nbsp;Rut</td>
                <td bgcolor="#F8F8F8"                  >&nbsp;&nbsp;&nbsp;</td>
            </tr>
            </table>
     
</div>
     
         
   
    <br />
       
     
<br>     
<font class="titulo">Numero de envio: 1170115050593</font>&nbsp;<font class="texto_seguimiento" style="color:Red"></font>
<br />
<font class="texto_seguimiento2">

</font>
    &nbsp;<br>

     
    <br> 
    <table class="tracking">
        <tr height="30px">
            <th                     >ESTADO DEL ENVIO</th>
            <th >FECHA  </th>
            <th >OFICINA</th>
        </tr>                     
     
        <tr height="30px">
            <td>&nbsp;&nbsp;ENVIO ENTREGADO                                 &nbsp;</td>
            <td align='center'>26/07/2017 13:25    &nbsp;</td>
            <td >&nbsp;&nbsp;SANTIAGO CDP 01                        &nbsp;</td>
        </tr>   
     
        <tr class="impar" height="40px">
            <td>&nbsp;&nbsp;ENVIO EN REPARTO              &nbsp;</td>
            <td align='center'>26/07/2017 8:31 &nbsp;</td>
            <td >&nbsp;&nbsp;SANTIAGO CDP 01                    &nbsp;</td>
        </tr>
     
        <tr height="30px">
            <td>&nbsp;&nbsp;RECIBIDO EN OFICINA DE CORREOSCHILE                                 &nbsp;</td>
            <td align='center'>26/07/2017 8:26    &nbsp;</td>
            <td >&nbsp;&nbsp;SANTIAGO CDP 01                        &nbsp;</td>
        </tr>   
     
        <tr class="impar" height="40px">
            <td>&nbsp;&nbsp;DESPACHADO A OFICINA DE CORREOSCHILE              &nbsp;</td>
            <td align='center'>26/07/2017 3:25 &nbsp;</td>
            <td >&nbsp;&nbsp;CEN CENTRO TECNOLOGICO POSTAL                    &nbsp;</td>
        </tr>
     
        <tr height="30px">
            <td>&nbsp;&nbsp;EN OFICINA DE TRANSITO                                 &nbsp;</td>
            <td align='center'>14/07/2017 9:30    &nbsp;</td>
            <td >&nbsp;&nbsp;CEN CENTRO TECNOLOGICO POSTAL                        &nbsp;</td>
        </tr>   
     
        <tr class="impar" height="40px">
            <td>&nbsp;&nbsp;RECIBIDO EN OFICINA DE CORREOSCHILE              &nbsp;</td>
            <td align='center'>14/07/2017 9:30 &nbsp;</td>
            <td >&nbsp;&nbsp;CEN CENTRO TECNOLOGICO POSTAL                    &nbsp;</td>
        </tr>
     
        <tr height="30px">
            <td>&nbsp;&nbsp;DESPACHADO A OFICINA DE CORREOSCHILE                                 &nbsp;</td>
            <td align='center'>13/07/2017 23:05    &nbsp;</td>
            <td >&nbsp;&nbsp;PLANTA LA SERENA                        &nbsp;</td>
        </tr>   
     
        <tr class="impar" height="40px">
            <td>&nbsp;&nbsp;DESPACHADO A OFICINA DE CORREOSCHILE              &nbsp;</td>
            <td align='center'>13/07/2017 18:41 &nbsp;</td>
            <td >&nbsp;&nbsp;COQUIMBO CDP 01                    &nbsp;</td>
        </tr>
     
        <tr height="30px">
            <td>&nbsp;&nbsp;SE HA REALIZADO PRIMER INTENTO DE ENTREGA. SE DEJO AVISO                                 &nbsp;</td>
            <td align='center'>24/05/2017 15:46    &nbsp;</td>
            <td >&nbsp;&nbsp;COQUIMBO CDP 01                        &nbsp;</td>
        </tr>   
     
        <tr class="impar" height="40px">
            <td>&nbsp;&nbsp;ENVIO EN REPARTO              &nbsp;</td>
            <td align='center'>23/05/2017 8:59 &nbsp;</td>
            <td >&nbsp;&nbsp;COQUIMBO CDP 01                    &nbsp;</td>
        </tr>
     
        <tr height="30px">
            <td>&nbsp;&nbsp;RECIBIDO EN OFICINA DE CORREOSCHILE                                 &nbsp;</td>
            <td align='center'>23/05/2017 7:37    &nbsp;</td>
            <td >&nbsp;&nbsp;COQUIMBO CDP 01                        &nbsp;</td>
        </tr>   
     
        <tr class="impar" height="40px">
            <td>&nbsp;&nbsp;DESPACHADO A OFICINA DE CORREOSCHILE              &nbsp;</td>
            <td align='center'>23/05/2017 4:46 &nbsp;</td>
            <td >&nbsp;&nbsp;PLANTA LA SERENA                    &nbsp;</td>
        </tr>
     
        <tr height="30px">
            <td>&nbsp;&nbsp;DESPACHADO A OFICINA DE CORREOSCHILE                                 &nbsp;</td>
            <td align='center'>20/05/2017 16:17    &nbsp;</td>
            <td >&nbsp;&nbsp;CEN CENTRO TECNOLOGICO POSTAL                        &nbsp;</td>
        </tr>   
     
        <tr class="impar" height="40px">
            <td>&nbsp;&nbsp;EN OFICINA DE TRANSITO              &nbsp;</td>
            <td align='center'>19/05/2017 0:23 &nbsp;</td>
            <td >&nbsp;&nbsp;CEN CENTRO TECNOLOGICO POSTAL                    &nbsp;</td>
        </tr>
     
        <tr height="30px">
            <td>&nbsp;&nbsp;RECIBIDO EN OFICINA DE CORREOSCHILE                                 &nbsp;</td>
            <td align='center'>19/05/2017 0:23    &nbsp;</td>
            <td >&nbsp;&nbsp;CEN CENTRO TECNOLOGICO POSTAL                        &nbsp;</td>
        </tr>   
     
        <tr class="impar" height="40px">
            <td>&nbsp;&nbsp;DESPACHADO A OFICINA DE CORREOSCHILE              &nbsp;</td>
            <td align='center'>18/05/2017 19:04 &nbsp;</td>
            <td >&nbsp;&nbsp;SUCURSAL MONEDA                    &nbsp;</td>
        </tr>
     
        <tr height="30px">
            <td>&nbsp;&nbsp;RECIBIDO POR CORREOSCHILE                                 &nbsp;</td>
            <td align='center'>18/05/2017 11:16    &nbsp;</td>
            <td >&nbsp;&nbsp;SUCURSAL MONEDA                        &nbsp;</td>
        </tr>   
     
    </table>

 
</div> 
</form>
</body>
</body>
</html>