Datos personales

viernes, 23 de diciembre de 2011

Problema ScriptResource.axd - Acceso Denegado de javascript en sitios con frames

Estoy desarrollando una aplicacion que muestra en un iframe otra aplicacion que contiene controles calendar ajax. El problema es que no despliega el calendario y aparece el siguiente error :

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. 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):

    <asp:ScriptManager ID="ScriptManager1" runat="server" >
        <Scripts>
            <asp:ScriptReference Name="MicrosoftAjax.js" ScriptMode="Auto" Path="../Includes/MicrosoftAjax.js"/>
        </Scripts>
    </asp:ScriptManager>

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


Referencia:
http://creeperionet.blogspot.com/2011/12/problema-acceso-denegado-de-javascript.html

miércoles, 7 de diciembre de 2011

ERROR ASP NET : The source file is different from when the module was built

A esto se le suele llamar Dessincronización de Código
"There is no source code available for the current location" Error que emite Visual Studio en medio del debuggueo. Se da porque se produce una desincronización entre los diferentes proyectos de una solución (entre otras razones). Si al aparecernos por primera vez le dimos en el boton "NO" Entonces Visual Studio guardará una referencia del proyecto problemático para ignorarlo las proximas veces que se debuggea, por lo que cada vez que queremos depurar ese código nos va a aparecer "There is no source code available for the current location" para deseperarnos. 

Para solventar esta situación damos clic derecho sobre la Solución (NO sobre el proyecto). En "Common Properties" vamos a "Debug Source Files" y una vez ahi borramos las entradas del proyecto problematico que se encuentren en la sección inferior de la pantalla de la derecha denominada "Do not look for these source files". Esto provocará que Visual Studio no ignore las entradas del proyecto y nos permita de debugguearlo. 

Finalmente mientras nos encontramos en las properties de la Solucion, Nos vamos "Configuration Properties" y dentro de esta a "Configuration" y nos aseguramos que el check "Build" de los proyectos este checkeado, lo cual le indicará a Visual Studio que estos proyectos tienen que compilarse cuando ejecutamos la solucion en modo de debuggeo. Damos clic en aceptar y Generamos. Ya con esto deberíamos tener sincronizado nuestro código y el error en cuestión debería dejar de rondar por nuestra solución.

Lo último es ir a las carpetas donde se generan las dll de los proyectos (en mi caso bussiness y data) y eliminar las carpetas bin y obj. Volver a generar el proyecto y listo.

martes, 6 de diciembre de 2011

Errores ASP.NET en web farms muy comunes - Validation of viewstate MAC failed

Errores ASP.NET en web farms muy comunes

Hay veces que tenemos una aplicacion web ASP.NET que está alojada en un Proveedor de Internet o ISP y se instala en una granja de servidores web o "WebFarm" que no es ni más ni menos que varios servidores en paralelo que actúan como si fuera uno solo por si se cae uno y responda a las peticiones web otro servidor de la granja de forma transparente al usuario. En esos casos a veces despues de entrar en un area privada de nuestra aplicacion web que usa variables de sesion inexplicablemente nos sale un error parecido a esto y nos dice que debemos tocar el Machine.config pero el servidor no es nuestro!:
Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.
Esto está muy bien para conseguir Redundancia y alta disponibilidad mediante los servicios de Clustering de Windows 2003 pero tiene una pega para nuestros compañeros los desarrolladores web. ¿Cual? Pues que cuando usamos variables de sesión en nuestra aplicación web , estas quedan almacenadas por defecto en el servidor web que estaba ejecutando la aplicación y si este cae por un fallo hardware o de comunicación por ejemplo entonces otro servidor web que no tiene tus variables de sesion recogerá las peticiones http a tu web y no sabrá quien eres si identificabas a tu visitante con un Session("idusuario") recogido por ejemplo al autentificarse en la web.
Para esto veo 2 soluciones posibles :
1- Poner esto en el web.config <pages enableViewStateMac="false" /> como sugieren algunos ISP. Ojo, esto debe ponerse dentro de <system.web></system.web>
Esta propiedad tambien puede aplicarse a paginas web aspx individuales en la directiva <@Page %>  y por defecto suele ser false. Aqui teneis mas informacion sobre la propiedad en la MSDN. Para el que no lo sepa , esta directiva se usa para evitar la corrupxion o alteración de los datos conforme se envían a una pagina web.
2- Habilitar el estado de las sesiones en SQL Server. Al estar las sesiones en el servidor de base de datos, es independiente de que se caiga el servidor web, pues podrá recuperar las sesiones de una base de datos externa al servidor web. En este articulo podeis ver como configurar sql server para ello, pero tened en cuenta que debéis ser administradores del servidor y no servirá en un alojamiento compartido a no ser que seais "amigo" del propietario del servidor :-)
NOTA: Por defecto en el web config que se genera en Visual Studio el estado de sesion se guarda asi:
<sessionState
mode="InProc"
stateCon蠌ectionString="tcpip=127.0.0.1:42424"
sqlConnectio蚼String="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>

AVISO IMPORTANTE:
No olvideis nunca cuando paséis a produccion vuesrtas web asp.net generar los ensamblados en modo Release y no Debug y cambiar estas lineas en el web.config para que queden así
<compilation defaultLanguage="vb" debug="false" /> 
¿Acaso vais a depurar la aplicacion en el servidor web de desarrollo? Con esto no teneis que subir a bin el fichero .pdb que se genera en asp.nett 1.x sino solo los ensamblados .dll
<customErrors mode="RemoteOnly" /> Para que los errores asp.net no aparezcan a usuarios que no estén en el servidor local y no puedan recopilar información para un ataque ;-)
Saludos

lunes, 19 de septiembre de 2011

Sumar valores de textbox ItemTemplate en FooterTemplate de DataGrid

Estoy trabajando una funcionalidad de sistema Asp.net 2.0. Hago uso de un datagrid, y tengo una columna de tipo textbox que solo debe aceptar valores numéricos. En el footer del datagrid, se deben sumas los valores de dichos textbox, tarea que se me hizo algo complicada, pero que ya logré realizarla.

Esta imagen muestra parte del datagrid que estoy usando (la suma no es correcta ya que solo tome las ultimas filas para la imagen)

El Itemtemplate del datagrid tiene la siguiente forma:



El código para hacer la suma es el siguiente:

Sub
sumarFooter()
Dim tabla As Table = CType(Me.dgreservas.Controls(0), Table) //el datagrid es una tabla, asi que lo convertimos a TABLA
Dim foot As DataGridItem = tabla.Controls(tabla.Controls.Count - 1) //el footer vendria a ser el total de controles de la tabla -1
Dim lblfoot As Label = foot.FindControl("lblFootComi")   //de esa ultima fila, obtengo el control donde se hará la sumaDim totalComision As Double = 0
For Each item As DataGridItem In dgreservas.Items  //recorro el datagrid y hago la suma
Dim txtComis As TextBox = CType(item.FindControl("txtcomision"), TextBox)
   If IsNumeric(txtComis.Text.Trim) Then
     totalComision = totalComision + Convert.ToDecimal(txtComis.Text)    End If
Next
lblfoot.Text = Str(totalComision)  //coloco la suma en el control que esta en el footer
End Sub


Espero haber ayudado un poquito. Saludos!!!

sábado, 17 de septiembre de 2011

Crystal Reports 2005 y Windows 7 64 bits

Estuve trabajando con la versión de Crystal Reports que viene como componente en la instalación de Visual Studio 2005 en una computadora que tiene instalado el SO Windows 7 64 bits.

Al momento de ejecutar el reporte, me aparecía el siguiente mensaje de error:

" An error has occurred while attempting to load the Crystal Reports runtime.
Either the Crystal Reports registry key permissions are insufficient or the Crystal Reports runtime is not installed correctly.
Please install the appropriate Crystal Reports redistributable (CRRedist*.msi) containing the correct version of the Crystal Reports runtime (x86, x64, or Itanium) required.  Please go to http://www.businessobjects.com/support for more information. "

En mi caso, estoy desarrollando una aplicación Windows que comprende una solución con 3 proyectos:
2 ClassLibrary y 1 Windows Forms.

Sección 1
- En la aplicación Windows Forms, hacer click derecho - >Propiedades
- En la pestaña DEPURAR, seleccionar en PLATAFORMA, la opción (x86).
- Generar el proyecto y listo.

Si no encuentran la opción x86 en la aplicación Windows Forms, hacer lo siguiente:
- Clic derecho a la solución, PROPIEDADES
- Ir a fucha PROPIEDADES DE CONFIGURACION
- Hacer clic en el boton Administrador de Configuración... que se encuentra en la parte superior
- Ubicar el nombre de su aplicación Windows y dar clic en la columna PLATAFORMA, para la fila señalada.
- Hacer clic en NUEVA
- En la opción NUEVA PLATAFORMA, hacer clic en x86
- Aceptar

Ahora ir a lo anteriormente explicado (sección 1) y listo

Saludos, espero haberlos ayudado...!!!

jueves, 15 de septiembre de 2011

Solucion para cuando vence Windows XP 30 días

Tuve un problema con una compu que tiene instalado Windows XP. Era una version de 30 días, y al culminarse este período, no me dejaba ingresar a windows. Bueno, googleando encontré esta solución que hoy comparto con uds:
Inicio -> Ejecutar -> Escribir rundll32.exe syssetup,SetupOobeBnk

Reiniciar y listo. Espero  haber ayudado. Saludos

jueves, 1 de septiembre de 2011

Redireccionar de www a "sin www" - Aspnet

Hace un momento tuve la necesidad de que cada vez que un usuario escriba en su navegador la direccion:
http://www.midominio.com/ esta redireccione automaticamente a  http://midominio.com/.
Estoy trabajando con asp.net 1.1 (Visual Studio 2003)
Lo que tenemos que hacer es agregar unas líneas de código a nuestro web.config, en la penúltima línea, antes de cerrar el configuration (</configuration>)
Bueno, ahi va:

 <system.webServer>
        <rewrite>
            <rules>
                <rule name="CanonicalHostNameRule1">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^midominio\.com$" negate="true" />
                    </conditions>
                    <action type="Redirect" url="
http://midominio.com/{R:1}" />
                </rule>
            </rules>
        </rewrite>
  </system.webServer>


Ahora cada vez que el usuario escribe : http://www.midominio.com/ la url cambia a http://midominio.com/
Espero haber ayudado con mi experiencia. Saludos


miércoles, 24 de agosto de 2011

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding

Este error "Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding", me apareció un día mientras hacia una consulta a mi BD SQL Server 2005, desde mi aplicación Web ASP-NET.


Bueno después de googlear un poco encontré la solución a este problema. Lo que sucede es que la consulta en la base de datos tomaba varios segundos y la conexión no espera lo suficiente, por lo tanto hay que hacer que la conexión espere a que la consulta termine de procesarse.
Bueno la solución que de inmediato me dio resultado es:

- En el código de la consulta a la base de datos, donde haces uso del SQLCOMMAND, hay que agregar la siguiente linea:(Ojo: micommand es una variable de tipo SQLCOMMAND)
micommand .CommandTimeout = 60;

Si esto no te da resultado, no desesperes, aquí quizás encuntres algo que te puede ayudar
 - En la cadena de conexión agregar:
"server=LocalHost;uid=sa;pwd=;database=DataBaseName;Connect Timeout=200; pooling='true'; Max Pool Size=200" 

 - Si no les da resultado, prueben con esto:
En el Web config
<system.web>
            <customErrors mode="Off"/>
            <httpRuntime appRequestQueueLimit="100" executionTimeout="60000" />

</system.web> 
 

Saludos, éxitos...!!!


martes, 16 de agosto de 2011

Error al restaurar Base de Datos Sql 2005

Intenté retaurar una Base de Datos SQL 2005 mediante un backup y me dió el siguiente error

Bueno lo que hay que hacer es lo siguiente:

USE master
GO
ALTER DATABASE mibased SET single_user WITH rollback immediate
ALTER DATABASE mibased SET multi_user

Y LISTO...!!!
¿Que ocurría?
Pues bien lo que pasaba es que la base de datos estaba abierta por otro proceso y teníamos que cerrar todas las conexiones.

Espero haber ayudado. Saludos

lunes, 8 de agosto de 2011

Validación de asp:textbox con números irrepetibles

Para este caso se me pidió validar las cajas de texto <asp:textbox> para que solo se escriban números del 1 al 4 y que un número ya escrito en un tetbox no se repita en otro. Asi:


En realidad no es nada difícil pero lo dejo por si alguna vez alguien lo necesita.  Dibujamos en pantalla 4 textbox, yo los llamé de la siguiente forma: txt_prg17_1, txt_prg17_2, txt_prg17_3, txt_prg17_4
Ahora vamos a hacer uso de una función javascript:
<script language="javascript">
            //función trim para quitar los espacios en blanco
        function trim (myString)
            {
            return myString.replace(/^\s+/g,'').replace(/\s+$/g,'')
            }
           
            function soloNumeros(evt,orden) //evt es el valor digitado, y orden indica a que textbox vamos a validar, si se escribe 1 es el 1er textbox
            {    
                //Validar la existencia del objeto event    
                evt = (evt) ? evt : event;      
                ////Extraer el codigo del caracter de uno de los diferentes grupos de codigos    
                var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode : ((evt.which) ? evt.which : 0));      
                //Predefinir como valido     
                var respuesta = true;      
                //Validar si el codigo corresponde a los NO aceptables
                  //valido solo los números del 1 al 4 y el backspace   
                if (charCode > 31 && (charCode < 49 || charCode > 52))    
                {        
                    //Asignar FALSE a la respuesta si es de los NO aceptables        
                    respuesta = false;  
                 }      
            
                //
                if (orden==1) // para el 1er textbox
                        {
// obtengo los valores de los textbox 2,3,4
                              var b = document.getElementById("<%=txt_prg17_2.ClientID %>").value;
                              var c = document.getElementById("<%=txt_prg17_3.ClientID %>").value;
                              var d = document.getElementById("<%=txt_prg17_4.ClientID %>").value;
                         
                              if (trim(b)!="") // validar que tenga valor
                              {
                                    var b_asc=b.charCodeAt(0); // convirto el valor del textbox2 en ascii
                                    if(charCode==b_asc) // comparo ascii si son iguales signnifica q estoy ingresando un valor duplicado asi que se retorna falso
                                          return false;
                              }
                              if (trim(c)!="")
                              {
                                    var c_asc=c.charCodeAt(0);
                                    if(charCode==c_asc)
                                          return false;
                              }
                              if (trim(d)!="")
                              {
                                    var d_asc=d.charCodeAt(0);
                                    if(charCode==d_asc)
                                          return false;
                              }
                        }
                        if (orden==2) // para el 2do textbox
                        {
                              var a = document.getElementById("<%=txt_prg17_1.ClientID %>").value;
                              var c = document.getElementById("<%=txt_prg17_3.ClientID %>").value;
                              var d = document.getElementById("<%=txt_prg17_4.ClientID %>").value;
                 
                              if (trim(a)!="")
                              {
                                    var a_asc=a.charCodeAt(0);
                                    if(charCode==a_asc)
                                          return false;
                              }
                              if (trim(c)!="")
                              {
                                    var c_asc=c.charCodeAt(0);
                                    if(charCode==c_asc)
                                          return false;
                              }
                              if (trim(d)!="")
                              {
                                    var d_asc=d.charCodeAt(0);
                                    if(charCode==d_asc)
                                          return false;
                              }
                        }
                        if (orden==3) // para el 3er textbox
                        {
                              var a = document.getElementById("<%=txt_prg17_1.ClientID %>").value;
                              var b = document.getElementById("<%=txt_prg17_2.ClientID %>").value;
                              var d = document.getElementById("<%=txt_prg17_4.ClientID %>").value;
                 
                              if (trim(a)!="")
                              {
                                    var a_asc=a.charCodeAt(0);
                                    if(charCode==a_asc)
                                          return false;
                              }
                              if (trim(b)!="")
                              {
                                    var b_asc=b.charCodeAt(0);
                                    if(charCode==b_asc)
                                          return false;
                              }
                              if (trim(d)!="")
                              {
                                    var d_asc=d.charCodeAt(0);
                                    if(charCode==d_asc)
                                          return false;
                              }
                        }
                        if (orden==4) // para el 4to textbox
                        {
                              var a = document.getElementById("<%=txt_prg17_1.ClientID %>").value;
                              var b = document.getElementById("<%=txt_prg17_2.ClientID %>").value;
                              var c = document.getElementById("<%=txt_prg17_3.ClientID %>").value;
                 
                              if (trim(a)!="")
                              {
                                    var a_asc=a.charCodeAt(0);
                                    if(charCode==a_asc)
                                          return false;
                              }
                              if (trim(b)!="")
                              {
                                    var b_asc=b.charCodeAt(0);
                                    if(charCode==b_asc)
                                          return false;
                              }
                              if (trim(c)!="")
                              {
                                    var c_asc=c.charCodeAt(0);
                                    if(charCode==c_asc)
                                          return false;
                              }
                        }
                return respuesta;   // si las validaciones se pasaron con éxito, se escribe el valor digitado en la caja de texto
                                             
            }
</script>
Ahora en la vista html de nuestra página referenciamos a nuestra función javascript en el evento OnKeyPress de cada textbox
<asp:TextBox ID="txt_prg17_1" runat="server" MaxLength="1" Width="30px" onKeyPress="javascript:return soloNumeros(event,1)"></asp:TextBox>
<asp:TextBox ID="txt_prg17_2" runat="server" MaxLength="1" Width="30px" onKeyPress="javascript:return soloNumeros(event,2)"></asp:TextBox>
<asp:TextBox ID="txt_prg17_3" runat="server" MaxLength="1" Width="30px" onKeyPress="javascript:return soloNumeros(event,3)"></asp:TextBox>
<asp:TextBox ID="txt_prg17_4" runat="server" MaxLength="1" Width="30px" onKeyPress="javascript:return soloNumeros(event,4)"></asp:TextBox>
Con esto los textbox quedan validados. Este código de seguro se puede optimizar, reducir líneas de código, así que eso tambipen me queda como tarea pendiente jeje. Saludos