Volvemos a las andadas Error de asp.net El compilador falló con código de error 128

Hola de nuevo a todos, tras una temporada sin escribir por vacaciones, pereza y cambio de domicilio vuelvo a las andadas en mi blog para contaros experiencias que os puedan servir a otros en nuestro divertido trabajo diario. Aprovecho también para agradecer los ánimos de algunos lectores de mi blog que echaban de menos que les diera la lata con algún artículo interesante J para la comunidad. Y es que particularmente creo que es mejor hacer de Homo Sapiens que de Neanderthal como menciona David en su Blog.

 En esta ocasión, en medio de un hermoso SP (No , no hablo de un Stored Procedure sino de un hermoso Síndrome Post Vacacional! J) me encontré un error en una aplicación Web asp.net que me dejó algo extrañado pues mi aplicación Web funcionaba correctamente en asp.net 1.1 en servidores de desarrollo y producción pero no cuando la alojaba en un conocido ISP  Decía así al intentar cargar una página aspx :“el compilador falló con código de error 128”  Y al mostrar los errores del compilador detallados salia una línea muy larga que empezaba por: 

c:windowssystem32inetsrv> “c:windowsmicrosoft.netframeworkv1.1.4322
vbc.exe” /t:library /utf8output /R:”c:windowsmicrosoft.netframeworkv1.1.4322temporary asp.net filesrootc1c7a12a8dd6495assemblydl2
852a5f9eb42d1d6_a988c701componentart.web.ui.dll” /R:”c:windowsmicrosoft.netframeworkv1.1.4322temporary asp.net filesrootc1c7a12
a8dd6495assemblydl2483641e1a9101cc6_2788c701
busyboxdotnet.dll” /R:”c:windowsassemblygacsystem.web.services1.0.5000.0__b03f5f7f11d50a3asystem.web.services.dll” /R:”c:windowsassemblygacsystem1.0.5000.0__b77a5c561934e089
system.dll” /R:”c:windowsassemblygacsystem.web1.0.5000.0__b03f5f7f11d50a3asystem.web.dll”  

  Aquí se ve como la compilación falla al intentar cargar y ejecutar los ensamblados de la Web y se produce cuando usamos un componente de terceros como por ejemplo Busyboxdotnet que se ejecuta en el proceso W3wp.exe 
  
Este error es un bug del framework 1.1 y 1.0 que se subsana con el SP1 de W2003 o bien como dice en el siguiente artículo de la KB de Microsoft con un par de métodos: http://support.microsoft.com/kb/919085/es 

Evidentemente le tuve que advertír al ISP que “Algo pasaba con Mary” (Su servidor IIS que alojaba mi aplicación Web) y lo subsanaron sin problema 🙂

 

¿Como gestiono errores en mi aplicacion ASP.NET en tiempo de ejecución?

Se acerca la primavera que, como muchos sabéis, la sangre altera y puede producir errores en nuestro código con más frecuencia de la habitual :-). Hay veces que queremos personalizar los mensajes de error en tiempo de ejecución que arroja nuestra aplicación cuando se produce una excepción en nuestro código porque no está disponible la base de datos o cuando no se encuentra una página de nuestro sitio web. Para ello veo tres opciones muy claras y habituales:


1- Configurar la web para que no de información detallada del error que pueda servir a un atacante


Esto se hace desde el web.config. Unas líneas de código creo que valen mas que mil palabras y muchos conocemos codigos http 404 de pagina no encontrada y 403 de acceso no permitido para redirigirlos a una página .aspx hecha por nosotros:


<customErrors mode=”RemoteOnly” defaultRedirect=”AppErrors.aspx”>
   <error statusCode=”404″ redirect=”NoSuchPage.aspx”/>
   <error statusCode=”403″ redirect=”NoAccessAllowed.aspx”/>
</customErrors>


2.- Control estructurado de excepciones con Try.Catch. Aquí tenéis otro ejemplo sencillo de captura de error en la conexion a una base de datos donde la propiedad Message de la excepcion ex guarda el error producido. Recordar que el bloque finally siempre se ejecuta


Try
   SqlConnection1.Open()
   SqlDataAdapter1.Fill(Me.DsPubs1)
Catch ex As Exception
   If HttpContext.Current.Request.UserHostAddress = “127.0.0.1” Then
      Session(“CurrentError”) = ex.Message
    Else
      Session(“CurrentError”) = “Error processing page.”
    End If
    Server.Transfer(“ApplicationError.aspx”)
Finally
       SqlConnection1.Close()
End Try


3.- Crear un manejador global de errores en el global.asax.


 Hay un evento en el global.asax que nos permite capturar el error y redirigir a otra página como se ve en estas líneas de código en el que se guarda en  Server.GetLastError.Message el último error producido en la aplicacion:


Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
   Session(“CurrentError”) = “Global: ” & Server.GetLastError.Message
   Server.Transfer(“lasterr.aspx”)
End Sub


Espero os sean de utilidad para vuestras aplicaciones web ASP.NET como lo son para mi en mi trabajo diario.


Saludos


Sergio Vázquez

Eventos nuevos en el ciclo de vida de una pagina en ASP.NET 2.0

En ASP.NET 1.x existen en el ciclo de vida de una página los eventos Init, Load, Prerender y Unload que se disparaban en este orden y podiamos escribir código asociado a dichos eventos para poder modificar la salida de la página y el estado de los controles que la constituían.


La nueva versión de ASP.NET añade nuevos eventos para seguir el procesamiento de las peticiones de forma más precisa. Estos nuevos eventos son:


PreInit  Ocurre antes de que la página empiece a inicializarse y es el primer evento en el ciclo de vida de una página ASP.NET 2.0


Initcomplete Tiene lugar cuando se completa la inicialización de una página


PreLoad  Ocurre después de la inicialización y antes de que la página empiece a cargar la información del estado.


LoadComplete Ocurre despues de cargarse la página


PreRenderComplete Tiene lugar cuando la fase de Prerender esta acabada y todos los controles han sido creados. Despues de este evento el ViewState es guardado y se genera el HTML de la página.

Modelo de Codigo subyacente en VS2003 y el de separacion de codigo en VS2005

ASP.NET 1.x soporta compilación dinamica de los ficheros (.aspx), (.asmx),  (.ascx),  (.ashx), y global.asax. Estos tipos de ficheros son compilados automáticamente bajo demanda cuando se solicitan por primera vez en una aplicación web. La copia compilada es invalidada tan pronto como se detecta un cambio en el código fuente mientras que en ASP.NET 2.0 la característica de compilación bajo demanda se extiende a otros tipos de ficheros como los (.vb and .cs),  (.resx), (.wsdl),  (.xsd).  Despues de cambiar estos ficheros no es necesario forzar una compilación en VS.


Mediante la siguiente tabla trato de reflejar las principales diferencias entre el famoso Code -Behind (usa el atributo Codebehind) de las paginas ASP.NET 1.x y el Code-Separation de las paginas ASP.NET 2.0 en  las dos versiones de Visual Studio que mas se usan hoy en día. El nuevo modelo de código se implementa usando clases parciales usando el atributo CodeFile.























Modelo Code-Behind en Visual Studio .NET 2003.  Modelo clases parciales en Visual Studio 2005.

Necesita un directorio virtual IIS.


Puede acceder directamente a la instalación local de  IIS.


Carece de soporte FTP, acceso al sistema de archivos e IIS.


Tiene varias formas de abrir sitios web.


Necesita IIS en el pc de desarrollo.


Tiene su propio servidor web Cassini.


No permite abrir páginas individuales fuera de un proyecto.


No necesita abrir el proyecto entero; las páginas idividuales puede ser abiertas sin ser compiladas.


Necesita añadir explícitamente los ficheros al proyecto,


Elimina la necesidad de añadir explícitamente ficheros al proyecto.


 


Saludos


Sergio

¿Como leo certificados digitales de cliente en ASP.NET?

Hay veces que en vez de instalar un certificado digital SSL en el servidor web IIS, tal y como expliqué en el número 19 de Dotnetmania hace algún tiempo (próximamente estará disponible para su descarga gratuita en PDF), tenemos que leer un certificado digital de cliente que se instala en Internet Explorer para asegurarnos la identidad del visitante leyendo su nombre y DNI. Estos certificados los puede expedir una Entidad emisora de certificados como puede ser la Fábrica nacional de Moneda FNMT. Si lo que quieres es obtener la firma digital como ciudaddno puedes hacerlo en esta url http://www.cert.fnmt.es/index.php?cha=cit&sec=obtain_cert donde están todas las intrucciones detalladas. Ya sabéis que estos certificados se renuevan periódicamente como los SSL de servidor (puede no ser válido si ha caducado) y se pueden exportar en formato pfx de un pc a otro e incluso ponerle una clave o PIN.


 Aqui os copio un código sencillo en ASP.NET que os lee las características del certificado del cliente  en una petición http a través del famoso objeto Request que os puede ser de utilidad a más de uno:


Dim cert As HttpClientCertificate = Request.ClientCertificate


If cert.IsPresent Then


‘Get the Organization (O) field from the Subject section.


‘ certData.Text = cert.Get(“Subject O”)


Response.Write(“ServerSubject = ” & cert.ServerSubject & “<br>”)


Response.Write(“Subject = ” & cert.Subject & “<br>”)


Response.Write(“issuer = ” & cert.Issuer & “<br>”)


Response.Write(“Valido desde = ” & cert.ValidFrom & “<br>”)


Response.Write(“valido hasta = ” & cert.ValidUntil & “<br>”)


Response.Write(“valido ? = ” & cert.IsValid & “<br>”)


Response.Write(“tamaño de la clave secreta = ” & cert.SecretKeySize & “<br>”)


Response.Write(“Server issuer = ” & cert.ServerIssuer & “<br>”)


Response.Write(“Serial number hasta = ” & cert.SerialNumber & “<br>”)


Response.Write(“Codificacion = ” & cert.CertEncoding & “<br>”)


ElseIf Not cert.IsValid Then


Response.Write(“el certificado no es valido”)


 


Else


Response.Write(“No se ha encontrado certificado”)


 


End If


Dim desc As New X509Certificate(cert.Certificate)


Dim resultsTrue As String = desc.ToString(True)


Response.Write(“<br>despues de sacar flujo de bytes : ” & resultsTrue)


Response.Write(“<br>Hash string : ” & desc.GetCertHashString)


Response.Write(“<br>Algoritmo (parametros): ” & desc.GetKeyAlgorithmParametersString)


Response.Write(“<br>Clave publica: ” & desc.GetPublicKeyString)


Saludos


Sergio Vázquez

Proximo evento GUSENET 23 Febrero Murcia

Viernes 23 de febrero: “dotNet day”


– 16:00 / 16:30: Bienvenida y registro
– 16:30 / 17:30: La platorma .Net, overview y evolución hasta 3.0. Sergio Vázquez
– 17:30 / 18:15: Descanso
– 18:15 / 19:00: Windows Presentation Fundation (WPF): Diseñas o Desarrollas ? Óscar Montesinos
– 19:00 / 19:30: Organización de LABs en próximos eventos, ofertas de empleo, y otros


Lugar:   Universidad de Murcia


            Campus de Espinardo


Aula A.04 bis


            Aulario Norte


Plano del lugar: (es en el edificio nº 6 del plano)


http://www.um.es/universidad/planos/plano-espinardo/espinardo.php


 Saludos

El proximo Viernes 26 Evento del Gusenet en Elche

Como es habitual en nosotros el último viernes de cada mes celebramos el evento mensual del Grupo de Usuarios de .NET del Sureste Español, del cual , como algunos lectores saben , formo parte de la directiva. Esta vez el evento pretende dar una introducción a .net y a WPF(Windows Presentation Foundation). La agenda del evento es la siguiente y tendrá lugar en las instalaciones de Clave Informatica en Elche


 Agenda:


– 16:00 / 16:30: Bienvenida y registro
– 16:30 / 18:00: Windows Presentation Fundation (WPF) y .Net Framework 3.0
– 18:00 / 18:15: Descanso
– 18:15 / 19:00: .Net – vision general
– 19:00 / 19:30: cuestiones técnicas, ofertas de empleo, y otros


 Se repartirán CD de versiones Express de Visual Studio para los principiantes que deseen iniciarse en .NET por lo que será una buena ocasión para asistir los que desconocen esta tecnología .


 La URL de registro del evento está publicada en la web de la MSDN y esta vez me toca a mi dar la charla de Vision General de .NET


http://www.microsoft.com/spanish/msdn/spain/eventos/comunidad.mspx#uno


Esperamos veros por allí y pasar otro rato agradable con Murphy como no! 🙂


Saludos


Sergio Vázquez

Imprescindible: Las Herramientas de .NET Framework!

Aquí teneis todas en este enlace de la MSDN, caben destacar entre ellas las muy conocidas siguientes, algunas de las cuales os he comentado en anteriores post:


Herramienta Registro de IIS en ASP.NET (Aspnet_regiis.exe)


Herramienta Registro de SQL Server para ASP.NET (Aspnet_regsql.exe)


Herramienta de compilación de ASP.NET (Aspnet_compiler.exe)


Herramienta de comprobación de certificados (Chktrust.exe)


Desensamblador de MSIL (Ildasm.exe)


Ensamblador de MSIL (Ilasm.exe)


Herramienta Installer (Installutil.exe)


 Saludos


Sergio Vázquez

Mi "chuleta de SQL Server" como regalo de reyes


 Todos necesitamos alguna vez una “chuleta” por si se nos olvida de memoria algún comando en una profesión donde abundan siglas, comandos, instrucciones etc.. Os copio una esperando que le sea útil a más de uno como “regalo de reyes majos” como a mi me lo fue en su día 🙂


Los procedimientos almacenados de sistema siguientes  permiten ver estadísticas o información en tiempo real acerca de la base de datos o el servidor.


sp_who Usuarios y procesos actuales de SQL Server


sp_lock Bloqueos activos, así como información de bloqueos e interbloqueos


sp_spaceused Espacio en disco que utiliza una tabla o base de datos


sp_helpdb Bases de datos y sus objetos


sp_monitor Estadísticas de SQL Server, como el tiempo total de procesamiento, el número de lecturas y escrituras, y las conexiones


sp_helpindex Índices de una tabla


sp_statistics Todos los índices de una tabla específica


Variables global Objetivo


@@connections Contiene el número de inicios de sesión o intentos de inicio de sesión desde la última vez que se inició SQL Server.


@@error Contiene el número de error de la última instrucción de Transact-SQL ejecutada.


@@spid Contiene el identificador de proceso de servidor del proceso de usuario actual. Puede usar este valor para identificar el proceso de usuario actual en la salida de sp_who.


@@procid Contiene el identificador de procedimiento almacenado del procedimiento actual.

Instrucciones T-SQL

set statistics IO Muestra información acerca del volumen de actividad de disco que generan las instrucciones de Transact-SQL. Útil para afinar índices junto con los planes de ejecución.


set statistics time Muestra el número de milisegundos necesarios para analizar, compilar y ejecutar cada instrucción.


set statistics profile Muestra un conjunto de resultados después de cada consulta ejecutada que represente un perfil de ejecución de la consulta.


set showplan_text on/off Hace que SQL Server no ejecute la consulta y que, en su  lugar, muestre información detallada acerca del modo en que se ejecutan las instrucciones.


Instrucciones DBCC


SQLPERF Estadísticas desde la última vez que se inició el servidor. Puede establecerlas para reunir información acerca del uso del espacio del registro de transacciones en todas las bases  de datos (LOGSPACE), la entrada y salida de disco (IOSTATS), el uso de memoria y caché (LRUSTATS), o la actividad de red (NETSTATS).


OPENTRAN La transacción activa más antigua, así como las transacciones duplicadas distribuida y no distribuida más antiguas, si las hay, en la base de datos especificada.Los resultados sólo se muestran si hay una transacción activa o si la base de datos contiene información de duplicación.


SHOW_STATISTICS Selectividad de un índice, lo que supone la base para determinar si un índice es útil para el optimizador de consultas.


CHECKDB Asignación e integridad estructural de todos los objetos de una base de datos.


CHECKFILEGROUP Asignación e integridad estructural de todas las tablas delgrupo de archivos.


CHECKTABLE Integridad de las páginas de datos, índice o de datos de tipo text, ntext o image de la base de datos especificada.


Saludos


Sergio Vázquez


http://www.pangeaes.com/mutisdotnet


 

Estoy marcado, tengo que continuar la cadena o me caeran 100 años de mala suerte!

Gracias a mi amiga Ethel de MS no me queda mas remedio que confesaros algunas intimidades:


1.- De peque lo mío eran los Pokes del spectrum 48K y juegos que reventaba conun amigo como el Fernando Martín de Dynamic. Seguro que a mas de uno le habrá pasado 🙂 Evidentemente ya os podéis imaginar como acabé de viciado , y eso que ahora me gusta menos programar. Serán los años? Tambien empece con Internet por el 1994 con el flamante modem de 9600 baudios y el NEtscape 1.0, Eudora, Gopher, IRC. Ha llovido mucho desde entonces y he pasado por unos 20-30 lenguajes de programación de los cuales no soportaba LISP.


2.- Suelo comprar la ropa nueva a golpes en verano  y en Invierno en tiendas conocidas como Springfield,Zara, Pull and Bear y no suelo lucir marcas en la ropa porque no me considero “hombre anuncio”. Es una de mis manías.


3.- Mi padre era un hombre aficionado a los dichos y suelo recurrir mucho a ellos. Soy un tio de pocas palabras por eso me llamaban Mutis antes. Sinceramente no me suelo enrollar como las persianas. Algunos de los dichos los suelto en clases que doy y no puedo evitarlo e incluso podeis ver algunos en este blog


4.- Una vez me enteré que fui el primer ingeniero informático sordo profundo de la historia de la Universidad. E incluso os puedo contar como anécdota que llegué a hacer unas prácticas de la carrera con un compa ciego. Aquello era como la peli “No me chilles que no te veo!” XDD. Me leia todos los libros de la biblioteca y hasta el bibliotecario el muy !”·$%$·& me llegaba a preguntar si sabia si estaba disponible un libro jeje , lo mandaba al carajo de vez en cuando. Y pasaba por todos los despachos de la facultad uno a uno a preguntar dudas pues no me enteraa de mucho en clase y llegué a hacer amistad con algún profesor pues los había de todos los tipos como os podéis imaginar. Incluso algunos compas son profesores.


5.- Soy un fanático de la ACB y del tenis, no suelo perderme un partido del equipo de Murcia de baloncesto Polaris desde que está un colega de tercer entrenador e incluso le doy consejos y le paso dvds de .NET porque hizo parte de la carrera conmigo (hay que evangelizar a los colegas jeje xDD). Si alguno/a quiere echar un partido de tenis que me lo diga! La verdad es que me gusta la vida sana para poder soportar el stress de la profesión.


Bueno a ver… a quien mando el TAG, a algun lector: a ver a ver: Vargas,Jorge Serrano,Spakinz, Miguel Llopis, Salva Ramos y Óscar Montesinos alias XINO, tenéis que seguir la cadena chicos!