<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Desarrollo en .NET</title><link>http://geeks.ms/blogs/dcerredelo/default.aspx</link><description>Desarrollo en C# bajo la plataforma .NET y Mono</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Agregar ensamblados adicionales a nuestra solución de SharePoint 2010</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/05/07/agregar-ensamblados-adicionales-a-nuestra-soluci-243-n-de-sharepoint-2010.aspx</link><pubDate>Mon, 07 May 2012 08:14:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204907</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204907</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/05/07/agregar-ensamblados-adicionales-a-nuestra-soluci-243-n-de-sharepoint-2010.aspx#comments</comments><description>&lt;p&gt;En esta entrada veremos c&amp;oacute;mo agregar ensamblados adicionales a nuestras soluciones de SharePoint 2010 y poder implementarlos en el GAC o a nivel WebApplication en nuestros servidores.&lt;/p&gt;
&lt;p&gt;El primer paso es abrir el paquete de nuestra soluci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/Paquete.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Una vez tengamos el paquete abierto, accedemos a la secci&amp;oacute;n &amp;quot;Avanzadas&amp;quot; que encontraremos en la parte inferior derecha.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/Avanzadas.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Ahora debemos hacer clic en el bot&amp;oacute;n &amp;quot;Agregar&amp;quot; y seleccionar &amp;quot;Agregar ensamblado existente...&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/Agregar.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;S&amp;oacute;lo queda seleccionar el ensamblado de inter&amp;eacute;s y el destino de la implementaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/EnsambladoAdicional.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/ListaEnsamblados.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/ListaEnsamblados.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204907" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>C# a fondo: Las clases System.Net.FtpWebRequest y System.Net.FtpWebResponse</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/05/02/c-a-fondo-las-clases-system-net-ftpwebrequest-y-system-net-ftpwebresponse.aspx</link><pubDate>Wed, 02 May 2012 08:17:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204809</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204809</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/05/02/c-a-fondo-las-clases-system-net-ftpwebrequest-y-system-net-ftpwebresponse.aspx#comments</comments><description>&lt;p&gt;El espacio de nombres &lt;strong&gt;System.Net&lt;/strong&gt; del .NET Framework proporciona una interfaz de programaci&amp;oacute;n sencilla para muchos de los protocolos que se utilizan en las redes.&lt;/p&gt;
&lt;p&gt;La clase &lt;strong&gt;FtpWebRequest&lt;/strong&gt; implementa un cliente FTP.&lt;/p&gt;
&lt;p&gt;La clase &lt;strong&gt;FtpWebResponse&lt;/strong&gt; encapsula la respuesta de un servidor de FTP a una solicitud.&lt;/p&gt;
&lt;p&gt;La clase &lt;strong&gt;WebRequestMethods.Ftp&lt;/strong&gt; representa los tipos de m&amp;eacute;todos del protocolo FTP que se pueden utilizar con una solicitud FTP.&lt;/p&gt;
&lt;p&gt;Veamos un ejemplo de trabajo con un servidor FTP usando estas clases que nos brinda el .NET Framework, en concreto las operaciones de subida, listado, descarga y borrado de ficheros.&lt;/p&gt;
&lt;p&gt;Espacios de nombres
&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;using System.IO;
using System.Net;
&lt;/pre&gt;
&lt;p&gt;
C&amp;oacute;digo com&amp;uacute;n a las distintas operaciones
&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;const string server = &amp;quot;ftp://localhost/&amp;quot;;
static NetworkCredential credentials = new NetworkCredential(&amp;quot;ftpuser&amp;quot;, &amp;quot;ftppw&amp;quot;);

const string document = &amp;quot;Documento.pdf&amp;quot;;
static string uploads = Environment.CurrentDirectory + @&amp;quot;\Subidas\&amp;quot;;
static string downloads = Environment.CurrentDirectory + @&amp;quot;\Descargas\&amp;quot;;

static void Main(string[] args)
{
    UploadFile();
    ListDirectory();
    DownloadFile();
    DeleteFile();
}
&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Subida de archivo&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;public static void UploadFile()
{
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(server + document);
    request.Credentials = credentials;
    request.Method = WebRequestMethods.Ftp.UploadFile;

    byte[] content = File.ReadAllBytes(uploads + document);

    request.ContentLength = content.Length;

    Stream stream = request.GetRequestStream();
    stream.Write(content, 0, content.Length);
    stream.Close();
}
&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Listado de contenido de directorio&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;public static void ListDirectory()
{
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(server);
    request.Credentials = credentials;
    request.Method = WebRequestMethods.Ftp.ListDirectory;

    using (StreamReader reader = new StreamReader(((FtpWebResponse)request.GetResponse()).GetResponseStream()))
    {
        Console.WriteLine(reader.ReadToEnd());
        reader.Close();
    }

    Console.Read();
}
&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Descarga de archivo&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;public static void DownloadFile()
{
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(server + document);
    request.Credentials = credentials;
    request.Method = WebRequestMethods.Ftp.DownloadFile;

    using (MemoryStream stream = new MemoryStream())
    {
        ((FtpWebResponse)request.GetResponse()).GetResponseStream().CopyTo(stream);
        File.WriteAllBytes(downloads + document, stream.ToArray());
    }
}
&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Borrado de archivo&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;public static void DeleteFile()
{
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(server + document);
    request.Credentials = credentials;
    request.Method = WebRequestMethods.Ftp.DeleteFile;

    request.GetResponse();
}
&lt;/pre&gt;
&lt;p&gt;
Para finalizar, el c&amp;oacute;digo en un proyecto de ejemplo de Visual Studio 2010 como fichero adjunto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Referencia&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.net.aspx" title="System.Net (Espacio de nombres)"&gt;System.Net&lt;/a&gt; (Espacio de nombres)&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.net.ftpwebrequest(v=vs.100).aspx" title="FtpWebRequest (Clase)"&gt;FtpWebRequest&lt;/a&gt; (Clase)&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.net.ftpwebresponse(v=vs.100).aspx" title="FtpWebResponse (Clase)"&gt;FtpWebResponse&lt;/a&gt; (Clase)&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.net.webrequestmethods.ftp.aspx" title="WebRequestMethods.Ftp (Clase)"&gt;WebRequestMethods.Ftp&lt;/a&gt; (Clase)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204809" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.20.48.09/DemoFTP.zip" length="169910" type="application/octet-stream" /><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Cómo usar la plantilla SketchFlow para Windows Phone con Expression Blend en español</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/04/27/c-243-mo-usar-la-plantilla-sketchflow-para-windows-phone-con-expression-blend-en-espa-241-ol.aspx</link><pubDate>Fri, 27 Apr 2012 16:44:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204728</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204728</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/04/27/c-243-mo-usar-la-plantilla-sketchflow-para-windows-phone-con-expression-blend-en-espa-241-ol.aspx#comments</comments><description>&lt;p&gt;El proyecto&amp;nbsp;&lt;span&gt;&lt;a target="_blank" title="SketchFlow Template for Windows Phone" href="http://wp7sketchflow.codeplex.com/"&gt;SketchFlow Template for Windows Phone&lt;/a&gt;&amp;nbsp;a&amp;ntilde;ade a Expression Blend +&amp;nbsp;SketchFlow un nuevo tipo de proyecto para realizar prototipos de aplicaciones Windows Phone de manera r&amp;aacute;pida y sencilla.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;La sorpresa desagradable que nos encontramos tras su instalaci&amp;oacute;n en la versi&amp;oacute;n en espa&amp;ntilde;ol de Expression Blend es que no aparece ning&amp;uacute;n tipo nuevo de proyecto en el entorno:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/SinProyecto.jpg" border="0" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;El problema es que el instalador de la plantilla ubica el contenido en la carpeta en ingl&amp;eacute;s y no tiene en consideraci&amp;oacute;n la posible existencia de otros idiomas. La soluci&amp;oacute;n pasa por copiar el archivo&amp;nbsp;&lt;/span&gt;&lt;b&gt;csWindowsPhonePrototype.zip&lt;/b&gt; desde su ubicaci&amp;oacute;n en la subcarpeta&amp;nbsp;&lt;b&gt;ProjectTemplates\en\CSharp\WindowsPhone&lt;/b&gt; de la ruta de instalaci&amp;oacute;n de Expression Blend (por defecto C:\Program Files (x86)\Microsoft Expression\Blend 4) a&amp;nbsp;&lt;b&gt;ProjectTemplates\es\CSharp\WindowsPhone&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/ConProyecto.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Por ahora no he detectado ning&amp;uacute;n funcionamiento an&amp;oacute;malo tras este &amp;quot;apa&amp;ntilde;o&amp;quot;, pero si detect&amp;aacute;is cualquier tipo de problema al trabajar con esta plantilla no dud&amp;eacute;is en comentarlo.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204728" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>Borrado eficiente de documentos y elementos en SharePoint 2010</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/04/26/borrado-eficiente-de-documentos-y-elementos-en-sharepoint-2010.aspx</link><pubDate>Thu, 26 Apr 2012 16:59:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204711</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204711</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/04/26/borrado-eficiente-de-documentos-y-elementos-en-sharepoint-2010.aspx#comments</comments><description>&lt;p&gt;El modelo de objetos de SharePoint 2010, en concreto la clase &lt;a title="SPWeb" href="http://msdn.microsoft.com/en-us/library/ms473942.aspx" target="_blank"&gt;SPWeb&lt;/a&gt;, nos brinda la posibilidad de ejecutar m&amp;uacute;ltiples operaciones en el servidor de manera transaccional gracias al m&amp;eacute;todo &lt;a title="ProcessBatchData" href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.processbatchdata.aspx" target="_blank"&gt;ProcessBatchData&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Veamos un ejemplo de borrado completo del contenido de una biblioteca y una lista que nos sirva como toma de contacto con la sintaxis y modo de empleo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Escenario&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;Partimos de una biblioteca de documentos y de una lista de contactos est&amp;aacute;ndar de SharePoint con los siguientes datos:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/Documentos.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/Datos.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;b&gt;C&amp;oacute;digo&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Creamos una aplicaci&amp;oacute;n de consola en el servidor de SharePoint estableciendo en las propiedades del proyecto que la plataforma de destino es x64.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/x64.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/x64.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Agregamos el espacio de nombres necesario:
&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;using Microsoft.SharePoint;
&lt;/pre&gt;
&lt;p&gt;
A continuaci&amp;oacute;n el c&amp;oacute;digo inicial del ejemplo. La l&amp;iacute;nea comentada realizar&amp;iacute;a el vaciado de la papelera posterior a la eliminaci&amp;oacute;n de todo el contenido de la lista y la biblioteca.
&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;static void Main(string[] args)
{
    using (SPWeb web = new SPSite(&amp;quot;http://intranet&amp;quot;).OpenWeb())
    {
        web.ProcessBatchData(GenerarLoteBorradoElementos(web.Lists[&amp;quot;Contactos&amp;quot;]).ToString());
        web.ProcessBatchData(GenerarLoteBorradoDocumentos((SPDocumentLibrary)web.Lists[&amp;quot;Documentos&amp;quot;]).ToString());

        // web.RecycleBin.DeleteAll();
    }
}
&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Borrado de elementos de una lista&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;private static StringBuilder GenerarLoteBorradoElementos(SPList lista)
{
    StringBuilder SB = new StringBuilder();
    SB.Append(&amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot; encoding=\&amp;quot;UTF-8\&amp;quot;?&amp;gt;&amp;lt;Batch&amp;gt;&amp;quot;);

    string comando = &amp;quot;&amp;lt;Method&amp;gt;&amp;lt;SetList&amp;gt;&amp;quot; + lista.ID + &amp;quot;&amp;lt;/SetList&amp;gt;&amp;lt;SetVar Name=\&amp;quot;ID\&amp;quot;&amp;gt;{0}&amp;lt;/SetVar&amp;gt;&amp;lt;SetVar Name=\&amp;quot;Cmd\&amp;quot;&amp;gt;Delete&amp;lt;/SetVar&amp;gt;&amp;lt;/Method&amp;gt;&amp;quot;;

    foreach (SPListItem item in lista.Items)
        SB.Append(string.Format(comando, item.ID.ToString()));

    SB.Append(&amp;quot;&amp;lt;/Batch&amp;gt;&amp;quot;);

    return SB;
}
&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Borrado de documentos de una biblioteca&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;La diferencia respecto al c&amp;oacute;digo de borrado de la lista es que para cada item de la biblioteca hay que especificar la URL relativa del documento.
&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;private static StringBuilder GenerarLoteBorradoDocumentos(SPDocumentLibrary biblioteca)
{
    StringBuilder SB = new StringBuilder();
    SB.Append(&amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot; encoding=\&amp;quot;UTF-8\&amp;quot;?&amp;gt;&amp;lt;Batch&amp;gt;&amp;quot;);

    string comando = &amp;quot;&amp;lt;Method&amp;gt;&amp;lt;SetList&amp;gt;&amp;quot; + biblioteca.ID + &amp;quot;&amp;lt;/SetList&amp;gt;&amp;lt;SetVar Name=\&amp;quot;ID\&amp;quot;&amp;gt;{0}&amp;lt;/SetVar&amp;gt;&amp;lt;SetVar Name=\&amp;quot;Cmd\&amp;quot;&amp;gt;Delete&amp;lt;/SetVar&amp;gt;&amp;lt;SetVar Name=\&amp;quot;owsfileref\&amp;quot;&amp;gt;{1}&amp;lt;/SetVar&amp;gt;&amp;lt;/Method&amp;gt;&amp;quot;;

    foreach (SPListItem item in biblioteca.Items)
        SB.Append(string.Format(comando, item.ID.ToString(), item.File.ServerRelativeUrl));

    SB.Append(&amp;quot;&amp;lt;/Batch&amp;gt;&amp;quot;);

    return SB;
}
&lt;/pre&gt;
&lt;p&gt;
Para finalizar, el c&amp;oacute;digo en un proyecto de ejemplo de Visual Studio 2010 como fichero adjunto.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204711" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.20.47.11/DeleteAll.zip" length="8011" type="application/octet-stream" /><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Accediendo a ASP.NET Page Methods y servicios WCF desde JavaScript con jQuery</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/04/24/accediendo-a-asp-net-page-methods-y-servicios-wcf-desde-javascript-con-jquery.aspx</link><pubDate>Tue, 24 Apr 2012 09:29:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204619</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204619</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/04/24/accediendo-a-asp-net-page-methods-y-servicios-wcf-desde-javascript-con-jquery.aspx#comments</comments><description>&lt;p&gt;Un &lt;strong&gt;Page Method&lt;/strong&gt; es un m&amp;eacute;todo declarado como &lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/yzh058ae.aspx" title="public (Referencia de C#)"&gt;public&lt;/a&gt; y &lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/98f28cdx.aspx" title="static (Referencia de C#)"&gt;static&lt;/a&gt; definido en el codebehind de una p&amp;aacute;gina aspx y &amp;quot;decorado&amp;quot; con el atributo&amp;nbsp;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.web.services.webmethodattribute.aspx" title="WebMethodAttribute (Clase)"&gt;WebMethod&lt;/a&gt; usado para los m&amp;eacute;todos de los servicios web.&lt;/p&gt;
&lt;p&gt;Windows Communication Foundation (&lt;strong&gt;WCF&lt;/strong&gt;)&amp;nbsp;es el modelo de programaci&amp;oacute;n de Microsoft para aplicaciones orientadas a servicios.&lt;/p&gt;
&lt;p&gt;Veamos un ejemplo de c&amp;oacute;mo acceder a un Page Method y un servicio WCF con jQuery, utilizando para ello la versi&amp;oacute;n 1.7.1. Comenzamos por una captura de la soluci&amp;oacute;n para tener clara la estructura:&lt;/p&gt;
&lt;p&gt;&lt;img border="0" src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/Soluci_F300_n.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;A continuaci&amp;oacute;n, el c&amp;oacute;digo html com&amp;uacute;n a ambas operaciones para ver posteriormente el c&amp;oacute;digo y configuraci&amp;oacute;n del lado servidor y la funci&amp;oacute;n JavaScript necesaria en cada caso.
&lt;/p&gt;
&lt;pre class="brush: html"&gt;&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Page methods y servicios WCF desde jQuery&amp;lt;/title&amp;gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;Scripts/jquery-1.7.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;
        &amp;lt;div&amp;gt;
            &amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Recibir mensaje desde page method&amp;quot; onclick=&amp;quot;RecibirMensajeDesdePageMethod()&amp;quot; /&amp;gt;
            &amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Recibir mensaje desde WCF&amp;quot; onclick=&amp;quot;RecibirMensajeDesdeWCF()&amp;quot; /&amp;gt;
            &amp;lt;p id=&amp;quot;Mensaje&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Accediendo a un Page Method con jQuery&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;El c&amp;oacute;digo de servidor para acceder a un Page Method es muy sencillo y no necesita ninguna configuraci&amp;oacute;n especial. Como se ha comentado al principio s&amp;oacute;lo necesitamos declarar un m&amp;eacute;todo de nuestra p&amp;aacute;gina aspx como p&amp;uacute;blico y est&amp;aacute;tico y decorarlo con el atributo WebMethod para poder utilizarlo directamente desde cliente:
&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;[WebMethod]
public static string EnviarMensajeDesdePageMethod()
{
    return &amp;quot;Llamada a un page method desde jQuery.&amp;quot;;
}
&lt;/pre&gt;
&lt;p&gt;
S&amp;oacute;lo nos queda desarrollar la funci&amp;oacute;n JavaScript encargada de la llamada y procesamiento del resultado con la ayuda de jQuery:
&lt;/p&gt;
&lt;pre class="brush: javascript"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
    function RecibirMensajeDesdePageMethod() {
        $.ajax({
            type: &amp;quot;POST&amp;quot;,
            url: &amp;quot;Default.aspx/EnviarMensajeDesdePageMethod&amp;quot;,
            data: &amp;quot;{}&amp;quot;,
            contentType: &amp;quot;application/json; charset=utf-8&amp;quot;,
            dataType: &amp;quot;json&amp;quot;,
            success: function (mensaje) {
                $(&amp;quot;#Mensaje&amp;quot;).text(mensaje.d);
            } 
        });
    }
&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Para finalizar, una captura del resultado:&lt;/p&gt;
&lt;p&gt;&lt;img border="0" src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/PageMethod.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Consumiendo un servicio WCF con jQuery&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;La creaci&amp;oacute;n y consumo desde JavaScript de un servicio WCF es un poco m&amp;aacute;s complejo. Para empezar, necesitamos agregar una referencia a System.ServiceModel.Web en nuestro proyecto ya que definiremos en el contrato de operaci&amp;oacute;n el m&amp;eacute;todo de llamada y formato de respuesta entre otras cosas. Vamos a ver el contrato del servicio:
&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;using System.ServiceModel.Web;

namespace jQueryDemo.Services
{
    [ServiceContract]
    public interface IMensajes
    {
        [OperationContract]
        [WebInvoke(Method = &amp;quot;POST&amp;quot;, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
        string EnviarMensajeDesdeWCF();
    }
}
&lt;/pre&gt;
&lt;p&gt;
A continuaci&amp;oacute;n, la implementaci&amp;oacute;n del contrato:
&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;namespace jQueryDemo.Services
{
    public class Mensajes : IMensajes
    {
        public string EnviarMensajeDesdeWCF()
        {
            return &amp;quot;Llamada a un servicio WCF desde jQuery.&amp;quot;;
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;
Ahora la configuraci&amp;oacute;n del servicio en su correspondiente secci&amp;oacute;n del Web.config:
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;&amp;lt;system.serviceModel&amp;gt;
  &amp;lt;behaviors&amp;gt;
    &amp;lt;serviceBehaviors&amp;gt;
      &amp;lt;behavior name=&amp;quot;ServiceBehavior&amp;quot;&amp;gt;
        &amp;lt;serviceMetadata httpGetEnabled=&amp;quot;true&amp;quot;/&amp;gt;
        &amp;lt;serviceDebug includeExceptionDetailInFaults=&amp;quot;true&amp;quot;/&amp;gt;
      &amp;lt;/behavior&amp;gt;
    &amp;lt;/serviceBehaviors&amp;gt;
    &amp;lt;endpointBehaviors&amp;gt;
      &amp;lt;behavior name=&amp;quot;EndpointBehavior&amp;quot;&amp;gt;
        &amp;lt;webHttp /&amp;gt;
      &amp;lt;/behavior&amp;gt;
    &amp;lt;/endpointBehaviors&amp;gt;
  &amp;lt;/behaviors&amp;gt;
  &amp;lt;services&amp;gt;
    &amp;lt;service behaviorConfiguration=&amp;quot;ServiceBehavior&amp;quot; name=&amp;quot;jQueryDemo.Services.Mensajes&amp;quot;&amp;gt;
      &amp;lt;endpoint address=&amp;quot;&amp;quot; binding=&amp;quot;webHttpBinding&amp;quot; contract=&amp;quot;jQueryDemo.Services.IMensajes&amp;quot; behaviorConfiguration=&amp;quot;EndpointBehavior&amp;quot;/&amp;gt;
    &amp;lt;/service&amp;gt;
  &amp;lt;/services&amp;gt;
&amp;lt;/system.serviceModel&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Y por &amp;uacute;ltimo la funci&amp;oacute;n JavaScript encargada de la llamada y procesamiento del resultado con la ayuda de jQuery:
&lt;/p&gt;
&lt;pre class="brush: javascript"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
    function RecibirMensajeDesdeWCF() {
        $.ajax({
            type: &amp;quot;POST&amp;quot;,
            url: &amp;quot;Services/Mensajes.svc/EnviarMensajeDesdeWCF&amp;quot;,
            data: &amp;quot;{}&amp;quot;,
            contentType: &amp;quot;application/json; charset=utf-8&amp;quot;,
            dataType: &amp;quot;json&amp;quot;,
            success: function (mensaje) {
                $(&amp;quot;#Mensaje&amp;quot;).text(mensaje.EnviarMensajeDesdeWCFResult);
            }
        });
    }
&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Para finalizar, una captura del resultado&amp;nbsp;&lt;span&gt;y el c&amp;oacute;digo en un proyecto de ejemplo de Visual Studio 2010 como fichero adjunto&lt;/span&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img border="0" src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/WCF.jpg" alt="" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204619" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.20.46.19/jQueryDemo.zip" length="46299" type="application/octet-stream" /><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/WCF/default.aspx">WCF</category><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/jQuery/default.aspx">jQuery</category></item><item><title>C# a fondo: La clase System.Diagnostics.Trace</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/04/21/c-a-fondo-la-clase-system-diagnostics-trace.aspx</link><pubDate>Sat, 21 Apr 2012 13:17:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204574</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204574</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/04/21/c-a-fondo-la-clase-system-diagnostics-trace.aspx#comments</comments><description>&lt;p&gt;El espacio de nombres &lt;strong&gt;System.Diagnostics&lt;/strong&gt; del .NET Framework proporciona clases que nos permiten interactuar&amp;nbsp;con los procesos del sistema, registros de eventos, contadores de rendimiento y depurar la aplicaci&amp;oacute;n y hacer seguimiento de la ejecuci&amp;oacute;n del c&amp;oacute;digo.&lt;/p&gt;
&lt;p&gt;La clase &lt;strong&gt;Trace&lt;/strong&gt; nos proporciona un conjunto de m&amp;eacute;todos y propiedades que nos facilitan el seguimiento del c&amp;oacute;digo.&lt;/p&gt;
&lt;p&gt;Es tarea com&amp;uacute;n en determinados procesos tener que mostrar por l&amp;iacute;nea de comandos informaci&amp;oacute;n acerca de la ejecuci&amp;oacute;n para mantener informado al usuario y a su vez almacenar esa informaci&amp;oacute;n en un archivo de log para su tratamiento posterior. Veamos como la clase Trace nos facilita el desarrollo en escenarios como el planteado, en el que necesitamos escribir en varios&amp;nbsp;agentes de escucha de seguimiento:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Espacio de nombres
&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;using System.Diagnostics;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;
C&amp;oacute;digo
&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;string Log = @&amp;quot;C:\Windows\Temp\Registro.log&amp;quot;;

Trace.Listeners.Clear();
Trace.Listeners.Add(new TextWriterTraceListener(Log));
Trace.Listeners.Add(new ConsoleTraceListener(false));
Trace.AutoFlush = true;

Trace.WriteLine(&amp;quot;Informaci&amp;oacute;n a mostrar al usuario y registrar en el log.&amp;quot;);
&lt;/pre&gt;
&lt;p&gt;
La funcionalidad proporcionada por la clase Trace va mucho m&amp;aacute;s all&amp;aacute; de lo mostrado en este ejemplo. Para profundizar en el tema, tenemos a nuestra disposici&amp;oacute;n la siguiente documentaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Referencia&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.diagnostics(v=vs.100).aspx" title="System.Diagnostics (Espacio de nombres)"&gt;System.Diagnostics&lt;/a&gt; (Espacio de nombres)&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.diagnostics.trace.aspx" title="Trace (Clase)"&gt;Trace&lt;/a&gt; (Clase)&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.diagnostics.tracelistener.aspx" title="TraceListener (Clase)"&gt;TraceListener&lt;/a&gt; (Clase)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204574" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Creación de un procedimiento almacenado de SQL Server con C#</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/04/16/creaci-243-n-de-un-procedimiento-almacenado-de-sql-server-con-c.aspx</link><pubDate>Mon, 16 Apr 2012 13:55:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204485</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204485</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/04/16/creaci-243-n-de-un-procedimiento-almacenado-de-sql-server-con-c.aspx#comments</comments><description>&lt;p&gt;SQL Server incorpora integrado el componente CLR del .NET Framework desde su versi&amp;oacute;n 2005, lo que nos permite aprovechar &amp;quot;toda&amp;quot; la potencia de .NET para realizar nuestros desarrollos de bases de datos. Realmente los espacios de nombres que se admiten en esta integraci&amp;oacute;n son limitados. Tenemos un listado completo en &lt;a target="_blank" href="http://msdn.microsoft.com/es-ES/library/ms403279.aspx" title="Bibliotecas de .NET Framework admitidas"&gt;Bibliotecas de .NET Framework admitidas&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Los tipos de elementos que podemos desarrollar gracias a esta integraci&amp;oacute;n con el CLR son: procedimientos almacenados, desencadenadores, agregados, funciones definidas por el usuario y tipos definidos por el usuario.&lt;/p&gt;
&lt;p&gt;Para habilitar la integraci&amp;oacute;n CLR en SQL Server debemos ejecutar el siguiente script de configuraci&amp;oacute;n:
&lt;/p&gt;
&lt;pre class="brush: sql"&gt;sp_configure &amp;#39;show advanced options&amp;#39;, 1;
go
reconfigure;
go
sp_configure &amp;#39;clr enabled&amp;#39;, 1;
go
reconfigure;
&lt;/pre&gt;
&lt;p&gt;
Veamos ahora un ejemplo de c&amp;oacute;mo desarrollar, implementar y ejecutar un procedimiento almacenado usando SQL CLR. Para ello vamos a utilizar Visual Studio 2010 y SQL Server 2008.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Desarrollo&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;Creamos un nuevo proyecto en Visual Studio utilizando la plantilla &amp;quot;Proyecto de base de datos SQL CLR de Visual C#&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;img style="border:0;" border="0" src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/Plantilla.jpg" width="507" height="315" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;A continuaci&amp;oacute;n, elegimos la conexi&amp;oacute;n de base de datos que queremos utilizar empleando el asistente y, una vez creado el proyecto, agregamos un nuevo elemento &amp;quot;Procedimiento almacenado&amp;quot;.&lt;/p&gt;
&lt;p&gt;Desarrollamos la funcionalidad del procedimiento almacenado, en este ejemplo recibe como par&amp;aacute;metros el nombre y apellidos de un cliente y lo inserta en la tabla correspondiente:
&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;[SqlProcedure]
public static void InsertarCliente(string nombre, string apellidos)
{
    using (SqlConnection conexion = new SqlConnection(&amp;quot;context connection=true&amp;quot;))
    {
        SqlCommand comando = new SqlCommand(&amp;quot;insert into Cliente (Nombre, Apellidos) values (@Nombre, @Apellidos)&amp;quot;, conexion);
        comando.Parameters.Add(new SqlParameter(&amp;quot;@Nombre&amp;quot;, SqlDbType.NVarChar) { Value = nombre });
        comando.Parameters.Add(new SqlParameter(&amp;quot;@Apellidos&amp;quot;, SqlDbType.NVarChar) { Value = apellidos });

        conexion.Open();
        comando.ExecuteNonQuery();
        conexion.Close();
    }
}
&lt;/pre&gt;
&lt;p&gt;
Destacar en este c&amp;oacute;digo la cadena de conexi&amp;oacute;n utilizada, que nos permite emplear el contexto de conexi&amp;oacute;n en el que se ejecuta el procedimiento almacenado evit&amp;aacute;ndonos tener que especificar servidor y credenciales.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ejecuci&amp;oacute;n y depuraci&amp;oacute;n&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;Una vez implementado mediante Visual Studio, podemos ejecutar y depurar el procedimiento almacenado de manera sencilla mediante el &amp;quot;Explorador de servidores&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;img border="0" src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/Debug.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementaci&amp;oacute;n&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;La implementaci&amp;oacute;n del procedimiento almacenado sin utilizar Visual Studio, en un entorno de producci&amp;oacute;n por ejemplo, la llevamos a cabo mediante el siguiente c&amp;oacute;digo:
&lt;/p&gt;
&lt;pre class="brush: sql"&gt;create assembly DemoSQLCLR from &amp;#39;c:\DemoSQLCLR.dll&amp;#39; with permission_set = safe
go
create procedure InsertarCliente
(
	@Nombre nvarchar(50),
	@Apellidos nvarchar(150)
)
as external name DemoSQLCLR.StoredProcedures.InsertarCliente
&lt;/pre&gt;
&lt;p&gt;
Y para retirar la implementaci&amp;oacute;n debemos ejecutar lo siguiente:
&lt;/p&gt;
&lt;pre class="brush: sql"&gt;drop procedure InsertarCliente
go
drop assembly DemoSQLCLR
&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204485" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/SQL+Server/default.aspx">SQL Server</category></item><item><title>Jornada técnica sobre Cloud Computing y Azure: jueves 19 de abril, CNTG en Santiago de Compostela</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/04/14/jornada-t-233-cnica-sobre-cloud-computing-y-azure-jueves-19-de-abril-cntg-en-santiago-de-compostela.aspx</link><pubDate>Sat, 14 Apr 2012 18:27:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204466</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204466</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/04/14/jornada-t-233-cnica-sobre-cloud-computing-y-azure-jueves-19-de-abril-cntg-en-santiago-de-compostela.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Jornada t&amp;eacute;cnica sobre Cloud Computing y Azure: Desarrollo de una aplicaci&amp;oacute;n y casos pr&amp;aacute;cticos reales&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jueves d&amp;iacute;a 19 de abril de 2012 de 10:00 a 13:30 horas&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;El jueves de la semana que viene tendr&amp;aacute; lugar en el &lt;a target="_blank" title="CNTG" href="https://cntg.xunta.es"&gt;Centro de Novas Tecnolox&amp;iacute;as de Galicia&lt;/a&gt;&amp;nbsp;una jornada t&amp;eacute;cnica sobre Cloud Computing y Azure.&lt;/p&gt;
&lt;p&gt;Participar&amp;aacute;n en esta jornada&amp;nbsp;&lt;span&gt;Jos&amp;eacute; Manuel Alarc&amp;oacute;n,&amp;nbsp;&lt;/span&gt;&lt;span&gt;Antonio G&amp;oacute;mez Pav&amp;oacute;n y, aunque en la noticia figura Rodrigo Corral, Plain Concepts confirm&amp;oacute; el d&amp;iacute;a de ayer a trav&amp;eacute;s de su twitter que ser&amp;aacute;&amp;nbsp;Luis Guerrero el encargado de la parte pr&amp;aacute;ctica.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Aun est&amp;aacute;is a tiempo de asistir ya que &lt;strong&gt;el plazo de inscripci&amp;oacute;n finaliza el d&amp;iacute;a 18 de abril&lt;/strong&gt;.&amp;nbsp;Nos vemos all&amp;iacute;.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" title="M&amp;aacute;s informaci&amp;oacute;n" href="https://cntg.xunta.es/web/cnt/noteventos?p_p_id=101_INSTANCE_iQRq&amp;amp;p_p_action=0&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;p_p_col_id=column-2&amp;amp;p_p_col_count=1&amp;amp;_101_INSTANCE_iQRq_struts_action=%2Ftagged_content%2Fview_content&amp;amp;_101_INSTANCE_iQRq_redirect=%2Fweb%2Fcnt%2Fhome&amp;amp;_101_INSTANCE_iQRq_assetId=140659"&gt;M&amp;aacute;s informaci&amp;oacute;n&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" title="Registro" href="https://cntg.xunta.es/web/cnt/acontecimientos"&gt;Registro&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204466" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/Noticias/default.aspx">Noticias</category></item><item><title>C# a fondo: La instrucción yield</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/04/12/c-a-fondo-la-instrucci-243-n-yield.aspx</link><pubDate>Thu, 12 Apr 2012 07:27:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204407</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204407</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/04/12/c-a-fondo-la-instrucci-243-n-yield.aspx#comments</comments><description>&lt;p&gt;La instrucci&amp;oacute;n &lt;strong&gt;yield&lt;/strong&gt;&amp;nbsp;se emplea en un bloque iterador. Un bloque iterador es una secci&amp;oacute;n de c&amp;oacute;digo que devuelve una secuencia de valores del mismo tipo.&lt;/p&gt;
&lt;p&gt;La instrucci&amp;oacute;n yield se emplea con la instrucci&amp;oacute;n &lt;strong&gt;return&lt;/strong&gt; para proporcionar un valor al objeto enumerador y con la instrucci&amp;oacute;n &lt;strong&gt;break&lt;/strong&gt; para indicar el final de la iteraci&amp;oacute;n. &lt;/p&gt;
&lt;p&gt;Veamos un ejemplo sencillo que nos aclare el concepto y nos muestre las ventajas de su uso. El siguiente m&amp;eacute;todo devuelve la lista de n&amp;uacute;meros pares comprendidos entre dos n&amp;uacute;meros:
&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;public static IEnumerable&amp;lt;int&amp;gt; ObtenerPares(int inicio, int fin)
{
    List&amp;lt;int&amp;gt; pares = new List&amp;lt;int&amp;gt;();

    for (int i = inicio; i &amp;lt;= fin; i++)
        if ((i % 2) == 0)
            pares.Add(i);

    return pares;
}
&lt;/pre&gt;
&lt;p&gt;
La instrucci&amp;oacute;n yield nos da la oportunidad de llevar a cabo este tipo de operaciones sin tener que declarar una variable en la que ir almacenando los distintos valores antes de proceder a su devoluci&amp;oacute;n como resultado:
&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;public static IEnumerable&amp;lt;int&amp;gt; ObtenerPares(int inicio, int fin)
{
    for (int i = inicio; i &amp;lt;= fin; i++)
        if ((i % 2) == 0)
            yield return i;
}
&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Referencia&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/9k7k7cf0(v=vs.100).aspx" title="yield"&gt;yield&lt;/a&gt; (Referencia de C#)&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/dscyy5s0.aspx" title="Iteradores"&gt;Iteradores&lt;/a&gt; (Gu&amp;iacute;a de programaci&amp;oacute;n de C#)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204407" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Fuentes personalizadas en nuestros proyectos web: Google Web Fonts y CSS3</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/04/09/fuentes-personalizadas-en-nuestros-proyectos-web-google-web-fonts-y-css3.aspx</link><pubDate>Mon, 09 Apr 2012 13:02:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204372</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204372</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/04/09/fuentes-personalizadas-en-nuestros-proyectos-web-google-web-fonts-y-css3.aspx#comments</comments><description>&lt;p&gt;A la hora de trabajar en el dise&amp;ntilde;o y desarrollo de nuestra web nos encontramos con el problema del limitado n&amp;uacute;mero de fuentes que podemos utilizar por la falta de seguridad de que nuestros usuarios las tengan instaladas en sus equipos. Vamos a ver a continuaci&amp;oacute;n dos soluciones que nos permiten usar fuentes personalizadas en nuestros proyectos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Google Web Fonts&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;a title="Google Web Fonts" href="http://www.google.com/webfonts" target="_blank"&gt;Google Web Fonts&lt;/a&gt; es un repositorio de fuentes open source optimizadas para web. El modo de empleo es muy sencillo, s&amp;oacute;lo hay que seleccionar las fuentes que nos interesan y a&amp;ntilde;adir a nuestra web el c&amp;oacute;digo que nos genera. Veamos un ejemplo:
&lt;/p&gt;
&lt;pre class="brush: html"&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;Google Web Fonts&amp;lt;/title&amp;gt;
        &amp;lt;link href=&amp;#39;http://fonts.googleapis.com/css?family=Sevillana&amp;#39; rel=&amp;#39;stylesheet&amp;#39; type=&amp;#39;text/css&amp;#39;&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;p style=&amp;quot;font-family: &amp;#39;Sevillana&amp;#39;; font-size: large&amp;quot;&amp;gt;Ejemplo de uso de Google Web Fonts.&amp;lt;/p&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/Google-Web-Fonts.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight:bold;"&gt;C&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;SS3&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="CSS3" href="http://www.w3.org/TR/CSS/" target="_blank"&gt;CSS3&lt;/a&gt; nos permite utilizar cualquier fuente mediante la declaraci&amp;oacute;n @font-face. Debemos declarar el nombre de la fuente y su ubicaci&amp;oacute;n en el servidor y ya podremos utilizarla como cualquier otra fuente en nuestro proyecto web:
&lt;/p&gt;
&lt;pre class="brush: html"&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
            @font-face {
                font-family: myFont;
                src: url(fonts/TunaAndHotDogsOnRye.eot);
                src: url(fonts/TunaAndHotDogsOnRye.ttf) format(&amp;quot;truetype&amp;quot;);
            }
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;p style=&amp;quot;font-family: &amp;#39;myFont&amp;#39;; font-size: large&amp;quot;&amp;gt;Ejemplo de carga de fuentes con CSS3.&amp;lt;/p&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/CSS3.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;En las pruebas realizadas, con las &amp;uacute;ltimas versiones de Mozilla Firefox y Google Chrome se ha cargado correctamente la fuente con formato ttf. Sin embargo, en Internet Explorer 9 no ha funcionado. En este momento, la l&amp;iacute;nea 6 es obligatoria para la compatibilidad con IE, que s&amp;oacute;lo soporta el formato eot (Embedded Open Type) propietario de Microsoft.&lt;/p&gt;
&lt;p&gt;Para ayudarnos con la conversi&amp;oacute;n del formato ttf a eot, tenemos a nuestra disposici&amp;oacute;n la herramienta open source &lt;a title="ttf2eot" href="http://code.google.com/p/ttf2eot/" target="_blank"&gt;ttf2eot&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204372" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/CSS/default.aspx">CSS</category></item><item><title>Consultas CAML en SharePoint 2010 simplificadas con Camlex.NET</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/04/06/consultas-caml-en-sharepoint-2010-simplificadas-con-camlex-net.aspx</link><pubDate>Fri, 06 Apr 2012 08:00:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204331</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204331</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/04/06/consultas-caml-en-sharepoint-2010-simplificadas-con-camlex-net.aspx#comments</comments><description>&lt;p&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/ms467521.aspx" title="CAML"&gt;CAML&lt;/a&gt;, lenguaje de marcado de aplicaciones de colaboraci&amp;oacute;n, se emplea en SharePoint para definir consultas a datos de listas. Puede resulta un poco engorroso trabajar con este lenguaje y aqu&amp;iacute; es donde entra en acci&amp;oacute;n el proyecto open source Camlex.NET.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://camlex.codeplex.com/" title="Camlex.NET"&gt;Camlex.NET&lt;/a&gt; simplifica la creaci&amp;oacute;n de consultas CAML permiti&amp;eacute;ndonos usar expresiones lambda para abstraernos de la sintaxis de este lenguaje de consulta y facilitarnos la creaci&amp;oacute;n de consultas complejas y din&amp;aacute;micas.&lt;/p&gt;
&lt;p&gt;Vamos a ver un ejemplo sencillo de c&amp;oacute;mo emplear Camlex.NET para generar una consulta CAML y consultar una lista de contactos existente en SharePoint desde una aplicaci&amp;oacute;n de consola.&lt;/p&gt;
&lt;p&gt;Partimos de una lista de contactos est&amp;aacute;ndar de SharePoint con los siguientes datos:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/Datos.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Creaci&amp;oacute;n del proyecto y descarga&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Creamos una aplicaci&amp;oacute;n de consola en el servidor de SharePoint estableciendo en las propiedades del proyecto que la plataforma de destino es x64.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/x64.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Descargamos &lt;a target="_blank" href="http://camlex.codeplex.com/releases/view/42931" title="Camlex.NET"&gt;Camlex.NET&lt;/a&gt; desde CodePlex, en este momento la &amp;uacute;ltima versi&amp;oacute;n es la 3.1. Una vez descargado y descomprimido, debemos agregar una referencia al ensamblado Camlex.NET.dll&amp;nbsp;en nuestro proyecto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Espacios de nombres&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;using CamlexNET;
using Microsoft.SharePoint;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;C&amp;oacute;digo y prueba&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;SPQuery query = new SPQuery();

Console.Write(&amp;quot;Compa&amp;ntilde;&amp;iacute;a: &amp;quot;);
string company = Console.ReadLine();
query.Query = Camlex.Query().Where(X =&amp;gt; (string)X[&amp;quot;Company&amp;quot;] == company).ToString();

Console.WriteLine(&amp;quot;Empleados: &amp;quot;);
foreach (SPListItem contact in new SPSite(&amp;quot;http://intranet&amp;quot;).OpenWeb().Lists[&amp;quot;Contactos&amp;quot;].GetItems(query))
    Console.WriteLine(contact[&amp;quot;FullName&amp;quot;].ToString());
&lt;/pre&gt;
&lt;p&gt;Si introducimos &amp;quot;Microsoft&amp;quot; como compa&amp;ntilde;&amp;iacute;a a consultar, la l&amp;iacute;nea 5 genera la siguiente consulta CAML:&lt;/p&gt;
&lt;pre class="brush: xml"&gt;&amp;lt;Where&amp;gt;
  &amp;lt;Eq&amp;gt;
    &amp;lt;FieldRef Name=&amp;quot;Company&amp;quot; /&amp;gt;
    &amp;lt;Value Type=&amp;quot;Text&amp;quot;&amp;gt;Microsoft&amp;lt;/Value&amp;gt;
  &amp;lt;/Eq&amp;gt;
&amp;lt;/Where&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Resultado y descarga&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/Resultado.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En la p&amp;aacute;gina del proyecto en CodePlex se plantean escenarios m&amp;aacute;s complejos que nos ayudar&amp;aacute;n a hacernos una idea de la cantidad de trabajo que nos ahorra a la hora de crear consultas con varios filtros. Veamos un ejemplo de consulta con condiciones &amp;quot;and&amp;quot; y &amp;quot;or&amp;quot;: &lt;/p&gt;
&lt;pre class="brush: csharp"&gt;var caml = Camlex.Query().Where(x =&amp;gt; (int)x[&amp;quot;ProductID&amp;quot;] == 1000 &amp;amp;&amp;amp; ((bool)x[&amp;quot;IsCompleted&amp;quot;] == false || x[&amp;quot;IsCompleted&amp;quot;] == null)).ToString();
&lt;/pre&gt;
&lt;p&gt;Esta sencilla consulta con Camlex.NET genera la siguiente consulta CAML: &lt;/p&gt;
&lt;pre class="brush: xml"&gt;&amp;lt;Where&amp;gt;
  &amp;lt;And&amp;gt;
    &amp;lt;Eq&amp;gt;
      &amp;lt;FieldRef Name=&amp;quot;ProductID&amp;quot; /&amp;gt;
      &amp;lt;Value Type=&amp;quot;Integer&amp;quot;&amp;gt;1000&amp;lt;/Value&amp;gt;
    &amp;lt;/Eq&amp;gt;
    &amp;lt;Or&amp;gt;
      &amp;lt;Eq&amp;gt;
        &amp;lt;FieldRef Name=&amp;quot;IsCompleted&amp;quot; /&amp;gt;
        &amp;lt;Value Type=&amp;quot;Boolean&amp;quot;&amp;gt;0&amp;lt;/Value&amp;gt;
      &amp;lt;/Eq&amp;gt;
      &amp;lt;IsNull&amp;gt;
        &amp;lt;FieldRef Name=&amp;quot;IsCompleted&amp;quot; /&amp;gt;
      &amp;lt;/IsNull&amp;gt;
    &amp;lt;/Or&amp;gt;
  &amp;lt;/And&amp;gt;
&amp;lt;/Where&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Por si todo esto fuera poco, existe un servicio online que convierte nuestras actuales consultas CAML a c&amp;oacute;digo C# para Camlex.NET disponible en&amp;nbsp;&lt;a target="_blank" href="http://camlex-online.org/" title="Camlex Online"&gt;camlex-online.org&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204331" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Generar documentos PDF desde HTML con C# utilizando iTextSharp</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/04/03/generar-documentos-pdf-desde-c-utilizando-itextsharp.aspx</link><pubDate>Tue, 03 Apr 2012 10:06:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204266</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204266</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/04/03/generar-documentos-pdf-desde-c-utilizando-itextsharp.aspx#comments</comments><description>&lt;p&gt;&lt;a title="iTextSharp" href="http://sourceforge.net/projects/itextsharp/" target="_blank"&gt;iTextSharp&lt;/a&gt;&amp;nbsp;es un port de&amp;nbsp;&lt;a title="iText" href="http://itextpdf.com/" target="_blank"&gt;iText&lt;/a&gt;, proyecto open source en Java para el trabajo con PDF. En esta entrada vamos a ver un ejemplo sencillo de c&amp;oacute;mo generar un PDF a partir de HTML.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Descarga&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Descargamos&amp;nbsp;&lt;a title="iTextSharp" href="http://sourceforge.net/projects/itextsharp/files/latest/download" target="_blank"&gt;iTextSharp&lt;/a&gt;&amp;nbsp;desde SourceForge, en este momento la &amp;uacute;ltima versi&amp;oacute;n es la 5.2.1. Una vez descargado y descomprimido, debemos agregar una referencia al ensamblado itextsharp.dll en nuestro proyecto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Espacios de nombres&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;using System.IO;
using iTextSharp.text;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text.pdf;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;C&amp;oacute;digo&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;string file = @&amp;quot;C:\Windows\Temp\Documento.pdf&amp;quot;;

string html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;quot; +
    &amp;quot;&amp;lt;img alt=\&amp;quot;Logo iText\&amp;quot; src=\&amp;quot;http://itextpdf.com/img/logo.gif\&amp;quot; height=\&amp;quot;50px\&amp;quot; width=\&amp;quot;50px\&amp;quot;&amp;gt;&amp;quot; +
    &amp;quot;&amp;lt;br&amp;gt;Generaci&amp;oacute;n de PDF desde HTML con &amp;lt;b&amp;gt;iTextSharp&amp;lt;/b&amp;gt;.&amp;quot; +
    &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;

Document document = new Document(PageSize.A4, 80, 50, 30, 65);
PdfWriter.GetInstance(document, new FileStream(file, FileMode.Create));
document.Open();

foreach (IElement E in HTMLWorker.ParseToList(new StringReader(html), new StyleSheet()))
    document.Add(E);

document.Close();
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Resultado&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Para finalizar, una captura del resultado obtenido y el c&amp;oacute;digo en un proyecto de aplicaci&amp;oacute;n de consola de Visual Studio 2010 como fichero adjunto.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/dcerredelo/iTextSharpDemo.jpg" border="0" alt="" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204266" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.20.42.66/iTextSharpDemo.zip" length="1292158" type="application/octet-stream" /><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Guía de Arquitectura N-Capas DDD .NET 4.0</title><link>http://geeks.ms/blogs/dcerredelo/archive/2012/04/02/gu-237-a-de-arquitectura-n-capas-ddd-net-4-0.aspx</link><pubDate>Mon, 02 Apr 2012 11:21:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204247</guid><dc:creator>Darío Cerredelo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/dcerredelo/rsscomments.aspx?PostID=204247</wfw:commentRss><comments>http://geeks.ms/blogs/dcerredelo/archive/2012/04/02/gu-237-a-de-arquitectura-n-capas-ddd-net-4-0.aspx#comments</comments><description>&lt;p&gt;A modo de presentaci&amp;oacute;n y primera entrada de blog en&amp;nbsp;&lt;a title="Geeks&amp;middot;ms" target="_blank"&gt;Geeks&amp;middot;ms&lt;/a&gt;, recuerdo a los que todav&amp;iacute;a no han le&amp;iacute;do este estupendo libro&amp;nbsp;gratuito&amp;nbsp;que se encuentra disponible para descarga la&amp;nbsp;&lt;a href="http://download.microsoft.com/download/D/3/6/D3619F8C-A47F-43A3-9C9F-839F93595FE0/guia_arquitectura_n-capas_orientada_al_dominio_con_net_4_0-microsoft_architecture.zip" title="Gu&amp;iacute;a de Arquitectura N-Capas DDD .NET 4.0" target="_blank"&gt;Gu&amp;iacute;a de Arquitectura N-Capas DDD .NET 4.0&lt;/a&gt; acompa&amp;ntilde;ado por sesiones en&amp;nbsp;v&amp;iacute;deo&amp;nbsp;en el &lt;a target="_blank" href="http://msdn.microsoft.com/es-es/architecture/default.aspx" title="Centro de Arquitectura - MSDN"&gt;Centro de Arquitectura - MSDN&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Por si esto fuera poco, en&amp;nbsp;CodePlex&amp;nbsp;tenemos a nuestra disposici&amp;oacute;n la &lt;a href="http://microsoftnlayerapp.codeplex.com/" title="Aplicaci&amp;oacute;n de ejemplo y borradores" target="_blank"&gt;aplicaci&amp;oacute;n de ejemplo&amp;nbsp;y borradores&lt;/a&gt;&amp;nbsp;que nos permite seguir la evoluci&amp;oacute;n de todo este material. A d&amp;iacute;a de hoy, la &amp;uacute;ltima versi&amp;oacute;n de la aplicaci&amp;oacute;n es la&amp;nbsp;&lt;span&gt;&lt;a href="http://microsoftnlayerapp.codeplex.com/releases/view/69008" title="V2.0.03 BETA N-Layered SampleApp .NET 4.0-EF4.3.1" target="_blank"&gt;V2.0.03 BETA&lt;/a&gt;&amp;nbsp;que data del 28 de marzo.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Videos&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;1.- &lt;a target="_blank" href="http://channel9.msdn.com/posts/channel9spain/Presentacin-Foro-Arquitectos-XXV/" title="Presentaci&amp;oacute;n Foro Arquitectos XXV y Aquitectura N-Layer DDD con .NET 4.0"&gt;Presentaci&amp;oacute;n Foro Arquitectos XXV y Aquitectura N-Layer DDD con .NET 4.0&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;2.- &lt;a target="_blank" href="http://channel9.msdn.com/posts/channel9spain/Capa-de-Infraestructura-de-Persistencia-y-Acceso-a-Datos/" title="Capa de Infraestructura de Persistencia y Acceso a Datos"&gt;Capa de Infraestructura de Persistencia y Acceso a Datos&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;3.- &lt;a target="_blank" href="http://channel9.msdn.com/posts/channel9spain/Desacoplamiento-entre-componentes-de-arquitecturas-N-Layer-IoC--DI/" title="Desacoplamiento entre componentes de arquitecturas N-Layer: SOLID &amp;amp; IoC &amp;amp; DI"&gt;Desacoplamiento entre componentes de arquitecturas N-Layer: SOLID &amp;amp; IoC &amp;amp; DI&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;4.- &lt;a target="_blank" href="http://channel9.msdn.com/posts/channel9spain/Capa-de-Modelo-de-Dominio-y-Aplicacin-en-Arquitecturas-N-Layer-DDD/" title="Capa de Modelo de Dominio y Aplicaci&amp;oacute;n en Arquitecturas N-Layer DDD"&gt;Capa de Modelo de Dominio y Aplicaci&amp;oacute;n en Arquitecturas N-Layer DDD&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;5.- &lt;a target="_blank" href="http://channel9.msdn.com/posts/channel9spain/Capa-de-Servicios-Distribuidos-en-Arquitecturas-N-Tier-Opciones/" title="Capa de Servicios Distribuidos en Arquitecturas N-Tier y novedades WCF 4.0"&gt;Capa de Servicios Distribuidos en Arquitecturas N-Tier y novedades WCF 4.0&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;6.- &lt;a target="_blank" href="http://channel9.msdn.com/posts/channel9spain/Capa-de-Presentacin-en-Arquitecturas-N-Layer/" title="Capa de Presentaci&amp;oacute;n en Arquitecturas N-Layer (Patrones MVC, MVVM, etc.)"&gt;Capa de Presentaci&amp;oacute;n en Arquitecturas N-Layer (Patrones MVC, MVVM, etc.)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;7.- &lt;a target="_blank" href="http://channel9.msdn.com/posts/channel9spain/Seguridad-en-aplicaciones-empresariales-Orientacin-a-Claims/" title="Seguridad en aplicaciones empresariales: &amp;lsquo;Orientaci&amp;oacute;n a Claims&amp;rsquo;"&gt;Seguridad en aplicaciones empresariales: &amp;lsquo;Orientaci&amp;oacute;n a Claims&amp;rsquo;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;8.- &lt;a target="_blank" href="http://channel9.msdn.com/posts/channel9spain/Nuevas-capacidades-de-Servidor-de-Aplicacin-con-AppFabric-DUBLIN/" title="Nuevas capacidades de Servidor de Aplicaciones con AppFabric (&amp;quot;VELOCITY&amp;quot; &amp;amp; &amp;quot;DUBLIN&amp;quot;)"&gt;Nuevas capacidades de Servidor de Aplicaciones con AppFabric (&amp;quot;VELOCITY&amp;quot; &amp;amp; &amp;quot;DUBLIN&amp;quot;)&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/aa699358.ncapas(es-es,MSDN.10).jpg"&gt;&lt;img height="405" width="507" alt="Arquitectura N-Capas" src="http://msdn.microsoft.com/aa699358.ncapas(es-es,MSDN.10).jpg" title="Arquitectura N-Capas" class="aligncenter" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/aa699358.mapeo(es-es,MSDN.10).jpg"&gt;&lt;img height="405" width="507" alt="Mapeo de Tecnolog&amp;iacute;as" src="http://msdn.microsoft.com/aa699358.mapeo(es-es,MSDN.10).jpg" title="Mapeo de Tecnolog&amp;iacute;as" class="aligncenter" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204247" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/dcerredelo/archive/tags/Arquitectura/default.aspx">Arquitectura</category></item></channel></rss>