martes, 6 de diciembre de 2011

Problema Acceso Denegado de javascript en sitios con frames

Resulta que tenía un sitio web en .Net desarrollado con controles Telerik el cual funcionaba estupendamente. El problema se presentó cuando la empresas decidió que mi pagina debería correr dentro de un iFrame en otra aplicación.

Después del obligado cambio en el diseño y distribución, me encontré con que muchos de los controles no funcionaban correctamente o de plano, ya no servían para nada. Para no hacer la historia más larga, encontramos que el problema era que mi aplicación se encontraba en un dominio y la aplicación maestra (la que encerró en un triste frame a mi aplicación) en otro.

Entre los errores que encontré estaba el siguiente:
Mensaje: Acceso denegado.
Línea: 5959
Carácter: 49
Código: 0
URI: http://192.200.4.248/NOMBRE_APLICACION/ScriptResource.axd?d=2TUSrXlGiZ-YhriQIxHvs2j2r3CD-1dxiNch9HtINJ1-xYqYmXVZ2MxqzBF9v_CRUg-thDlUW3uXGz_vysgmtwWzobIsUaqbRwJQzvcSjKo1&t=633093755470531249 

Ese o en lugar de ScriptResource.axd TelerikScript.axd o algo así. El punto es que la solución está en usar unos archivos de scripts modificados directamente en nuestros ScriptManagers. Esto se hace de la siguiente manera (en cada página que tenga un ScriptManager o RadScriptManager):

    <telerik:RadScriptManager ID="RadScriptManager1" runat="server" >
        <Scripts>
            <asp:ScriptReference Name="MicrosoftAjax.js" ScriptMode="Auto" Path="~/Includes/MicrosoftAjax.js"/>
        </Scripts>
    </telerik:RadScriptManager>

Adjunto aquí el par de archivos requeridos (MicrosoftAjax.js y MicrosoftAjax.debug.js).

Referencias:

http://madskristensen.net/post/Iframe-cross-domain-JavaScript-calls.aspx
http://weblogs.asp.net/bleroy/archive/2007/01/31/how-to-work-around-the-quot-access-denied-quot-cross-domain-frame-issue-in-asp-net-ajax-1-0.aspx
http://www.koders.com/javascript/fid512F223189A2C0D3E027DA32C0742FA88FEA3FD8.aspx

martes, 22 de noviembre de 2011

Obtener todas las propiedades de una clase

Recientemente necesite consumir un WebService que me regresaba un objeto que contaba con cientos de propiedades. Puesto a que no sabía exactamente cuál de todas ellas era la que buscaba, me di a la tarea de buscar una manera de cargar en un Grid todas sus propiedades junto con su valor correspondiente.

Después de un par de búsquedas en internet, y unas cuantas compiladas sin resultado, llegue al siguiente código que realiza la actividad perfectamente.

using System.Reflection; 

foreach (MemberInfo mi in NOMBRE_CLASE.GetType().GetMembers())

    try 
    { 
       if (mi != null && mi.MemberType == MemberTypes.Property) 
       { 
          PropertyInfo pi = mi as PropertyInfo; 
          if (pi != null) 
            Table.Rows.Add(mi.Name, pi.GetValue(NOMBRE_CLASE, null).ToString()); 
       } 
    } catch { } 
}

Nota:
El código lo tome de varios sitios del web, cuando tenga un poco de tiempo pondré los sitios de referencia.

viernes, 18 de noviembre de 2011

Copia simultanea mediante hilos de ejecución

¿Alguna vez se te presento la urgente necesidad de copiar cientos de memorias flash? Si la respuesta es no, y crees que no se te presentara jamás esta interesante oportunidad, pues entonces esta entrada no te será de gran ayuda, en caso contrario, si te ha pasado o mejor aún, te pasara próximamente (o te pasa regularmente) entonces no dudes en bajar este pequeño proyecto que te puede ayudar a hacerlo de manera más rápida.

Utiliza hilos de ejecución independiente y no esta pulido en absoluto, pero como está el fuente, pueden dejarlo tan simpático como decidan hacerlo.

Descargalo aquí

jueves, 31 de marzo de 2011

Cargar PDF y desplegarlo directamente en el Navegador

Aunque un link de descarga funciona bastante bien en la mayoría de los casos, puede ser que en algún momento determinado necesitemos cargar algún pdf directamente en una ventana emergente o en un frame.

Hacer esto con .net es sencillo y generalmente basta con usar el siguiente código:
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "inline;filename=" + NOMBRE_ARCHIVO);
Response.WriteFile(RUTA_COMPLETA + "\\" +
NOMBRE_ARCHIVO);
Response.End();

viernes, 11 de febrero de 2011

Encriptar Sección Web.Config

Aunque he visto quien opta por encriptar todo el web.config , a mí en realidad la única sección que me parece fundamental encriptar es la de connectionStrings, pero sin importar con cual sección deseemos trabajar, la forma de hacerlo es muy sencilla y la presento a continuación.

Asumiendo que ya se tiene un sitio Web cuyo nombre de la aplicación en el IIS es MI_SITIO_WEB seguir los siguientes pasos:

1.- Abrir una venta de símbolo del sistema y dirigirnos a la ruta:
%WinDir%\Microsoft.NET\Framework\vX.X.XXXX\
Según sea la versión del framework que utiliza la aplicación.
2.- Escribir el siguiente comando
aspnet_regiis.exe -pe "connectionStrings" -app "/MI_SITIO_WEB"
Donde connectionStrings es la sección que queremos.
Si el comando es ejecutado correctamente deberá desplegar lo siguiente
Encrypting configuration section...
Succeeded!
Una vez hecho esto, la sección indicada habrá cambiando de algo como esto:

<connectionStrings>
  <add name="CONN1" connectionString="Data Source=SERVER;Initial Catalog=DB;User ID=USR;Password=PSW" />
</connectionStrings>


En algo como esto:

< connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider" > < EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#" >
< EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" / > < KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#" >
< EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#" >
< EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" / >
< KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#" >
< KeyName >Rsa Key< /KeyName >
< /KeyInfo >
< CipherData >


Ahora tu sitio web tienen la sección encriptada pero accesible de manera transparente desde tu aplicación.
Información obtenida de http://carlosjuano.blogspot.com/2009/10/encriptar-el-webconfig.html

miércoles, 9 de febrero de 2011

Borrar registros duplicados en SQL

Después de muchos inventos como el uso de tablas temporales, cursores y otras tantas alternativas aparatosos (que si funcionan pues, pero que weba) , hoy encontré navegando en la red, como eliminar registros duplicados de manera rápida y sencilla.

Es importante mencionar que el siguiente procedimiento necesita una columna de identidad, así que si tu tabla no lo tiene, pues deberás agregarla aunque sea de manera temporal.

A continuación agrego el código:

DELETE Tabla
WHERE ColumnaIdentidad NOT IN
(
   SELECT MIN(ColumnaIdentidad)
     FROM Tabla
   GROUP BY CampoRepetido1, CampoRepetido2
)

El script lo saque de la siguiente dirección:

http://www.eggheadcafe.com/software/aspnet/34260753/eliminar-registros-duplicados-en-la-misma-tabla.aspx

martes, 25 de enero de 2011

Servidor BES recibe correo pero no envía.

Según estuve leyendo al respecto, existían como 7,428 razones para hacer eso posible, sin embargo la más común es que los usuarios no contaban con el permiso Send As. Si los usuarios del dominio pueden enviar correo correctamente, pero algún grupo no (como los administradores por ejemplo) el problema sigue siendo el mismo solo que para las cuentas protegidas.

La solución que realmente nos ayudo a nosotros fue ejecutar la siguiente línea de comandos :

dsacls “cn=AdminSDHolder,cn=System,dc=domain,dc=com” /G “domain.com\BESAdmin:CA;Send As”


Cambiando domain por el nombre del dominio.

Si no tienen instalado el dsacls pueden descargarlo desde la siguiente ruta:

http://www.microsoft.com/downloads/thankyou.aspx?familyId=6ec50b78-8be1-4e81-b3be-4e7ac4f0912d&displayLang=en

Mas información al respecto puede ser encontrado en los siguientes links:

http://www.xomba.com/blackberry_can_t_send_messages_domain_admin_bes_desktop_email_program_unable_submit_message

http://www.d-pit.com/content/view/840/39/

http://www.petestilgoe.com/2007/05/users-cannot-send-e-mail-messages-from-a-blackberry-mobile-device/

http://www.blackberryforums.com.au/forums/blackberry-general-discussion/2129-user-cant-send-emails-after-bes-4-1-updates.html

martes, 11 de enero de 2011

Las CTE (Common Table Expression)

Anteriormente utilizaba de manera regular las tablas temporales o las variables tipo tabla. En ambos casos tenia que definir la estructura de la tabla y posteriormente llenarla con datos y por último manipularla.

Ahora, utilizando las CTE, basta con declarar que columnas vamos a utilizar de la consulta para que se genere esa tabla sin ningún código adicional. El único inconveniente con el que me he encontrado, es que inmediatamente después de la CTE debe venir el SELECT, INSERT, UPDATE o DELETE con el que se desea utilizar los datos, puesto que posteriormente ya no se encuentra disponible.
A continuación agrego un ejemplo:
WITH TablaCTE(IdRegistro, ColumnaUno) AS
(
   SELECT IdRegistro, ColumnaUno
     FROM TablaOriginal
    WHERE MyCondicion
)
SELECT IdRegistro, ColumnaUno
FROM TablaCTE