Demasiada miel empalaga…
Agregar cabeceras SOAP entre mensajes
Para enviar informacion adicional al mensaje enviado entre servicios web existe una tecnica muy elegante que vale la pena mencionar; esta tecnica consiste en enviar datos adicionales entre mensajes. Para poder llevarlo es necesario que los datos a enviar sean enviados mediante una clase que herede de SoapHeader que se encuentra en System.Web.Services.Protocols, exponiendo sus metodos como publicos. Para completar la definicion del servicio web hay que agregar algun objeto en el servicio que la cabecera y ademas del atributo WebMethod es necesario agregar SoapHeader y como parametro del constructor del atributo el nombre del objeto que hereda de SoapHeader.
Ahora por la parte del cliente es muy sencillo pues el wsdl.exe expone la clase que hereda de SoapHeader entonces solo es necesario crear un objeto y configurar los miembros de la misma.
Reflexión
Los problemas siempre seran tan complejos como quieras verlos, aunque sus soluciones siempre resulten sencillas
Envio de correos mediante un servidor SMTP
Antes que nada hay que saber que version del framework se esta utilizando, la clase MailMessage ha sido considerada obsoleta y migrada para nuevas versiones, si se utilizan vesiones 1.x sera necesario utilizar el namespace System.Web.Mail y los valores del destinatario, remitente, asunto y cuerpo del mensaje seran configurados mediante sus propiedades, en cambio si se usan versiones 2.0 o posteriores la clase se localiza en el namespace System.Net.Mail y los valores antes mencionados seran configurados en el constructor de la clase.
Ahora pasando a la forma en la que este mensaje sera enviado por nuestro servidor que nuestro caso lo enviaremos mediante un servidor smtp, tendremos en mismo problema, para versiones 1.x se usara el namespace mencionado y la clase que se utilizara sera SmtpMail y para configurar el host de la clase lo haremos mediante la propiedad SmtpServer, para las versiones actuales sera mediante la clase SmtpClient ubicada en el namespace mencionado y el host sera configurado mediante el constructor. Cabe mencionar que es recomendable usar un canal seguro lo cual podemos configurarlo mediante la propiedad EnableSsl, y por supuesto enviarle las credenciales del usuario remitente asignado una instancia de System.Net.NetworkCredential en la propiedad Credentials de la clase.
Por ultimo, ambas clases contienen un metodo Send en el cual se le pasa como parametro el mensaje a enviar.
Conceptos basicos acerca de .Net Remoting
Tratare de englobar a grandes razgos lo que he captado acerca de este tema. Para mi .Net remoting implica conocer tecnologias cliente-servidor, donde el servidor ofrece la creacion de objetos que pueden ser referenciados o serializados por los clientes.
Comencemos con el diseño de las clases que queremos exponer, para comenzar tenemos que elegir entre si el objeto sera serializado y enviado al cliente o simplemente se enviara la referencia del objeto en el servidor, en caso de ser el primer caso debemos implementar la interfaz ISerializable o el atributo Serializable y tener el cuidado de que los miembros de la clase sean serializables o que hereden de la clase System.MarshalByRefObject, para el segundo caso solo sera necesario heredar de System.MarshalByRefObject.
Una vez definido este punto sera necesario definir la forma en la que seran activados estos objetos, activados por el servidor y activados por el cliente.
Para ser activados por el cliente solo es necesario definirlo por el metodo estatico RegisterActivatedClientType() de la clase RemotingConfiguration del espacio de nombres System.Runtime.Remoting, quizas los escenarios en los que recomiendan este tipo de activacion son en los que necesitemos que los objetos sean manejados en un diferente dominio de la aplicacion.
La activacion por parte del servidor es muy similar a los servicios web, para este tipo de activacion existen dos formas distintas de administrar las instancias: Singleton y Single Call.
Por singleton el servidor mantiene solo un objeto creado que atiende a las llamadas de los clientes, puede ser util cuando querramos compartir informacion o estados entre clientes. La forma de hacerlo es usando el metodo estatico RegisterWellKnownServiceType de la clase RemotingConfiguration del espacio de nombres System.Runtime.Remoting y en el segundo parametro definir con el enumerador WellKnownObjectMode.Singleton.
Para las activaciones por servidor de Single Call donde querremos que cada cliente tenga un objeto nuevo, utilizaremos el mismo metodo que Singleton pero con la diferencia de que usaremos el enumerador WellKnownObjectMode.SingleCall .
Reflexión
«Dios nos habla en voz baja, porque si no lo hace de esa forma nos abruma…»
Propiedades extendidas
Me resulta muy interesante esta funcionalidad de SQL Server, donde como su nombre lo dice se pueden agregar propiedades a los objetos de la base de datos. Estas propiedades son administradas mediante un asistente o bien mediante procedimientos almacenados con los cuales se pueden agregar(sp_addextendedproperty), eliminar(sp_dropextendedproperty) y/o actualizar(sp_updateextendedproperty) una propiedad extendida.
Para obtener la informacion de la propiedad basta con ejecutar una funcion(fn_listextendedpropert). Creo que vale la pena ver mas a detalle esta caracteristica tan poco conocida y ver las posibles soluciones que nos pueda ofrecer, ya sea como descripcion de las columnas, o bien como gestor de errores para violacion de claves, o datos adicionales a la creacion de la tabla, en fin la idea es agregar o extender algun dato para un objeto.
Dibujar sobre un formulario web
Cuando recien me titule, intentando buscar algun empleo me tope con una empresa donde solicitaban desarrolladores que supieran realizar graficas sobre un formulario web. Espero que con este post alguien tenga las nociones basicas y pueda enfrentar ese tipo de requerimientos.
Manos a la obra, en realidad el proceso es algo sencillo pues consiste en serializar el objeto en el formulario, para eso son necesarios varios requisitos.
1. Indicar que todo el contenido de formulario sera de tipo imagen
Response.ContentType = «image/jpeg»;
2. Tener un objeto de tipo System.Drawing.Bitmap, sobre el cual poder dibujar.
Bitmap imagen = new Bitmap(ancho, alto);
3. Se obtendra una referencia de tipo System.Drawing.Graphics con el metodo FromImage pasando como argumento el objeto Bitmap creado con anterioridad. Con esta referencia obtenida se pueden explotar una serie de metodos para dibujar un sin fin de formas, ya solo es cuestion de usar la imaginacion y algunas tecnicas de ilusion optica.
Graphics grafico = Graphics.FromImage(imagen);
4. Por ultimo y la parte mas importante es el serializar el objeto Bitmap en el formulario de la pagina, esto lo realizaremos con el metodo Save del objeto, utilizando como stream del formulario e indicando el tipo de formato al cual sera serializado.
imagen.Save(this.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
Espero que con estos pasos basicos puedan servirles para realizar imagenes dinamicamente para sus aplicaciones, recordemos que esta no es la unica solucion para graficar en una pagina web, y el escoger esta tecnica depende tanto del presupuesto como de los requerimientos del cliente.
Clases expuestas por un servicio web
Basicamente la problematica que tuve fue al momento de tratar de exponer algunas clases que tenia declaradas en una libreria biblioteca, el problema se presentaba cuando el nivel de anidamiento de las clases era, si mas no lo recuerdo, mayor a dos niveles, complicando el trabajo para el XmlSerializer, y dificultando el consumo del cliente. Para solucionar este problema solo basto con agregar al metodo del sevicio web el atributo de XmlInclude, esto simplifica el trabajo para XmlSerializer al momento de crear el wsdl por parte del cliente que lo comsume. Asi que como recomendación sugiero que si en su framework se expondran clases por medio de un servicio web y quieren conservar la seguridad de su codigo, apliquen este atributo.
Primeros pasos con WPF
He comenzado a ver los cursos que Microsoft «regala» acerca del .Net Framework 3.0 y aunque mi ingles no es tan basto como quisiera, he comprendido en parte el tema. En este post utilize el codigo de ejemplo del sitio para compartir el poder que actualmente tiene XML y lo que puede lograrse con unas cuantas lineas de codigo, porque en realidad no se usa mas que XAML , RSS y XPath para lograr algo sorprendente.
<StackPanel xmlns=’http://schemas.microsoft.com/winfx/2006/xaml/presentation’ xmlns:x=’http://schemas.microsoft.com/winfx/2006/xaml’>
<StackPanel.Resources>
<XmlDataProvider x:Key=»Electrocucarcha» Source=»http://electrocucaracha.wordpress.com/feed/» />
<DataTemplate x:Key=»Articulo»>
<TextBlock Text=»{Binding XPath=title}»/>
</DataTemplate>
</StackPanel.Resources>
<Label FontSize=»24″ FontWeight=»Bold» Content=»{Binding Source={StaticResource Electrocucarcha}, XPath=/rss/channel/title}»/>
<Label FontSize=»18″ FontStyle=»Italic» Content=»{Binding Source={StaticResource Electrocucarcha}, XPath=/rss/channel/description}»/>
<DockPanel DataContext=»{Binding Source={StaticResource Electrocucarcha}, XPath=/rss/channel/item}» Height=»500″>
<ListBox IsSynchronizedWithCurrentItem=»True» ItemTemplate=»{StaticResource Articulo}» ItemsSource=»{Binding}» DockPanel.Dock=»Left» Width=»300″/>
<Frame Source=»{Binding XPath=link}» DockPanel.Dock=»Right» />
</DockPanel>
</StackPanel>