Asp.Net tiene una forma de pescar cualquier excepción que ocurra en el sitio de forma centralizada.
En efecto lo único que tenemos que hacer es implementar el metodo Application_Error del archivo Global.asax en un sitio web y este se ejecutara cada vez que ocurra una excepción no controlada en la aplicación.
La excepción que ocurrió esta disponible accesando la función Server.GetLastError().
Por ejemplo podemos capturar la excepción y reportarla usando nlog, mandarla por email, etc.
jueves, 6 de junio de 2013
lunes, 3 de junio de 2013
Agregar Web Services en Visual Studio 2008 en adelante
En las versiones mas recientes de Visual Studio no se tiene la opción directa para añadir Web Services al proyecto, lo que se tiene es la opción de agregar referencias de servicios, estos servicios son los creados con WCF y aunque se puede usar un Web Service antiguo con WCF en ocasiones podemos necesitar un Web Service sin usar WPF por ejemplo si no queremos incluir la referencia a esos componentes en el proyecto.
En estos casos podemos incluir el Web Service siguiendo estos pasos.
Se selecciona agregar referencia de servicio como si fuéramos a agregar un servicio WCF.
En esta ventana seleccionamos el botón "Avanzadas..."
En la ventana que aparece seleccionamos "Agregar referencia web..."
Y finalmente nos aparece la pantalla para agregar un Web Service "clásico"
En estos casos podemos incluir el Web Service siguiendo estos pasos.
Se selecciona agregar referencia de servicio como si fuéramos a agregar un servicio WCF.
En esta ventana seleccionamos el botón "Avanzadas..."
En la ventana que aparece seleccionamos "Agregar referencia web..."
Y finalmente nos aparece la pantalla para agregar un Web Service "clásico"
domingo, 2 de junio de 2013
Obteniendo el texto de un PDF en .Net
PdfBox es una librería que permite entre otras cosas obtener el texto de un pdf, este software es para java pero se puede usar en gracias a IKVM que permite convertir archivos de java en dlls.
El ejemplo:
PDFBox se puede obtener en esta página: http://www.squarepdf.net/pdfbox-in-net/
El ejemplo:
using org.pdfbox.pdmodel;
using org.pdfbox.util;
using System;
public class GetText() {
public string Retrieve(string fileName) {
PDDocument doc = PDDocument.load(fileName);
PDFTextStripper stripper = new PDFTextStripper();
return stripper.getText(doc);
}
}
PDFBox se puede obtener en esta página: http://www.squarepdf.net/pdfbox-in-net/
sábado, 1 de junio de 2013
Gtk Builder en .Net
Gtk Builder es la forma mas moderna de crear interfaces en gtk por medio de un editor WYSIWYG, es mas completo que stetic y el editor no truena en cada paso.
Es posible usar GTK.Builder en proyectos .Net o Mono pero la documentación es practicamente inexistente de hecho yo aprendi a usarlo en un sitio de Python pues como siempre la gente de mono tiene el proyecto completamente descuidado.
Lo básico es crear el objeto cargar el archivo xml que creamos con el programa Glade (que también funciona en Windows) obtener la ventana que queremos usar y mostrarla, es mejor crear una ventana por archivo pues despues nos puede dar problemas encontrar objetos con el mismo identificador.
Tambien debemos escribir un poco de código para poder usar los objetos que contiene el archivo ya que no hay forma de cargarlos automaticamente, solo buscamos el objeto dentro del Builder y lo asignamos a una variable de la clase.
Para las señales (eventos) lo mejor es usar las referencias que encontramos en el paso anterior y asignar los eventos directamente ya que aunque hay una función para conectar los eventos es complicada y de todos modos ya tenemos las referencias así que es más facil hacerlo de esta manera.
A continuación el codigo de ejemplo:
Es posible usar GTK.Builder en proyectos .Net o Mono pero la documentación es practicamente inexistente de hecho yo aprendi a usarlo en un sitio de Python pues como siempre la gente de mono tiene el proyecto completamente descuidado.
Lo básico es crear el objeto cargar el archivo xml que creamos con el programa Glade (que también funciona en Windows) obtener la ventana que queremos usar y mostrarla, es mejor crear una ventana por archivo pues despues nos puede dar problemas encontrar objetos con el mismo identificador.
Tambien debemos escribir un poco de código para poder usar los objetos que contiene el archivo ya que no hay forma de cargarlos automaticamente, solo buscamos el objeto dentro del Builder y lo asignamos a una variable de la clase.
Para las señales (eventos) lo mejor es usar las referencias que encontramos en el paso anterior y asignar los eventos directamente ya que aunque hay una función para conectar los eventos es complicada y de todos modos ya tenemos las referencias así que es más facil hacerlo de esta manera.
A continuación el codigo de ejemplo:
<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkWindow" id="window1">
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
using System;
using Gtk;
namespace GTKBuilder {
class MainClass {
Window thisWnd = null;
Builder thisObject = null;
Button button1 = null;
Label label1 = null;
public static void Main (string[] args) {
Application.Init ();
MainClass tester = new MainClass();
tester.Show();
Application.Run ();
}
MainClass() {
InitializeComponent();
}
private void InitializeComponent(){
thisObject = new Gtk.Builder();
thisObject.AddFromFile("tester.glade");
thisWnd = (Window)thisObject.GetObject("window1");
label1 = (Label)thisObject.GetObject("label1");
button1 = (Button)thisObject.GetObject("button1");
button1.Clicked += (object sender, EventArgs e) => {
label1.Text = "Hello";
};
thisWnd.DeleteEvent += (o, args) => {
Application.Quit();
};
}
public void Show() {
thisWnd.ShowAll();
}
}
}
lunes, 27 de mayo de 2013
Mandar correos desde .Net Framework
En .Net Framework es posible mandar correos usando la clase SmtpClient esta funcionalidad se encuentra en los espacios de nombre System.Net y System.Net.Mail, se pueden mandar correos en formato de texto o html e incluir archivos adjuntos, es muy sencillo, a continuación el ejemplo:
public void SendMail() { SmtpClient sender = new SmtpClient("127.0.0.1", 25); sender.Credentials = new NetworkCredential("usr", "Password"); MailMessage message = new MailMessage("from@localhost", "to@localhost"); message.Subject = "Mail test"; message.Body = "This is a test"; message.IsBodyHtml = true; mailer.Send(message); }
Hasta la proxima!
domingo, 26 de mayo de 2013
Obtener la localización de usuarios web con GeoIP
En .Net tenemos la posibilidad de obtener la localización de nuestros usuarios usando las bases de datos y clases que proporciona MaxMind de manera gratuita, hay dos versiones de las bases de datos, para localizar el país, y para encontrar datos hasta el nivel de ciudad, las diferencia es que la base de datos de países es mucho mas pequeña pero en la versión de ciudades también podemos obtener también el país pero además la zona, la ciudad el código postal y otros datos.
Para usarla hay que copiar el archivo de datos a una carpeta accesible por nuestra aplicación, instanciar la clase LookupService y llamar sus métodos basandonos siempre en la ip del cliente.
La única inconveniencia es que las clases no vienen en formato binario, pero es cuestión de minutos compilarlas y añadirlas a nuestros proyectos.
A continuación un ejemplo muy simplificado de su uso en Asp.Net:
Para usarla hay que copiar el archivo de datos a una carpeta accesible por nuestra aplicación, instanciar la clase LookupService y llamar sus métodos basandonos siempre en la ip del cliente.
La única inconveniencia es que las clases no vienen en formato binario, pero es cuestión de minutos compilarlas y añadirlas a nuestros proyectos.
A continuación un ejemplo muy simplificado de su uso en Asp.Net:
public void Detect() { LookupService ls = new LookupService(Server.MapPath("/GeoLiteCity.dat") , LookupService.GEOIP_STANDARD); Location loc = ls.getLocation(Request.UserHostAddress); Response.Write(loc.regionName); }
sábado, 25 de mayo de 2013
Trucos de rendimiento en linq
Usar linq es muy tentador por la forma en que hace fácil escribir código sobre colecciones de valores ya sea en objetos, xml, sql o cualquier otra forma de agrupar valores, sin embargo hay que tener mucho cuidado con su uso ya que podemos caer en trampas que hacen el código muy lento, por ejemplo: en linq a objetos es muy fácil crear una expresión que busque un objeto con un determinado valor en una propiedad, sin embargo la trampa es que linq recorre toda la colección y compara objeto por objeto con el valor buscado, en colecciones pequeñas esto no es un problema pero si manejas un número de objetos significativo tu programa se puede alentar bastante, una posible solución es usar un árbol e indizarlo usando la propiedad que vas a buscar con lo que el rendimiento puede mejorarse incluso en varios de magnitud.
Otro ejemplo linq a xml, en este caso el problema es que el xml se almacena por completo en memoria, siendo una vez mas un problema con archivos grandes que nos pueden usar hasta gigabytes de memoria para archivos de solo unos megas, en estos casos puede convenir mas usar el xmlreader que lee los elementos uno por uno desde el stream y luego los descarta usando por lo tanto poquísima memoria.
Por supuesto las necesidades de cada programa varían y puedes encontrarte en que no tengas otra solución que usar linq.
Otro ejemplo linq a xml, en este caso el problema es que el xml se almacena por completo en memoria, siendo una vez mas un problema con archivos grandes que nos pueden usar hasta gigabytes de memoria para archivos de solo unos megas, en estos casos puede convenir mas usar el xmlreader que lee los elementos uno por uno desde el stream y luego los descarta usando por lo tanto poquísima memoria.
Por supuesto las necesidades de cada programa varían y puedes encontrarte en que no tengas otra solución que usar linq.
Suscribirse a:
Entradas (Atom)