<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8413869</id><updated>2012-02-16T18:27:31.565+01:00</updated><category term='asp.net'/><category term='tdd'/><category term='rhino mocks'/><category term='Visual Studio 2008'/><category term='programación'/><category term='mocking'/><category term='visual studio c#'/><category term='avanzis'/><category term='structuremap'/><title type='text'>Desarrollando en .NET</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>41</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8413869.post-4768449006384766313</id><published>2008-11-26T16:33:00.003+01:00</published><updated>2008-11-26T17:25:45.770+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='avanzis'/><category scheme='http://www.blogger.com/atom/ns#' term='rhino mocks'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='mocking'/><category scheme='http://www.blogger.com/atom/ns#' term='structuremap'/><title type='text'>Aprendiendo sobre Rhino Mocks y StructureMap</title><content type='html'>En el proyecto nuevo que estoy realizando en Avanzis estoy intentando poner en práctica las buenas prácticas que voy aprendiendo.&lt;br /&gt;&lt;br /&gt;En mi blog de la empresa he publicado dos artículos que tienen que ver con inyección de dependencias (dependency injection) y mocking que os pueden resultar interesantes.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.avanzis.com/blogs/richard-chamorro/i/10401/837/primeros-pasos-con-structuremap-y-la-inyeccion-de-dependencias"&gt;Primeros pasos con StructureMap y la Inyección de Dependencias&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;y&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.avanzis.com/blogs/richard-chamorro/i/10414/837/utilizar-rhino-mocks-y-structuremap-en-pruebas-unitarias-con-nunit"&gt;Utilizar Rhino Mocks y StructureMap en pruebas unitarias con NUnit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Os recomiendo leerlos en ese orden.&lt;br /&gt;&lt;br /&gt;Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-4768449006384766313?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/4768449006384766313/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=4768449006384766313' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/4768449006384766313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/4768449006384766313'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2008/11/aprendiendo-sobre-rhino-mocks-y.html' title='Aprendiendo sobre Rhino Mocks y StructureMap'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-3966098366045890629</id><published>2008-07-04T11:33:00.004+02:00</published><updated>2008-07-04T11:46:59.980+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='avanzis'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Mi nuevo blog en Avanzis</title><content type='html'>!Por fin tenemos un blog en &lt;a href="http://www.avanzis.com/"&gt;Avanzis&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;A partir comenzaré a publicar algunos de mis avances en programación, ideas sobre la Web 2.0 y negocios, en esta dirección:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.avanzis.com/blogs/richard-chamorro"&gt;http://www.avanzis.com/blogs/richard-chamorro&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Os invito a que lo visitéis ya que tiene algunos artículos sobre programación que os pueden resultar interesantes. Por ejemplo mi último pequeño, pero importante, descubrimiento:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.avanzis.com/blogs/richard-chamorro/i/7796/837/como-ignorar-los-acentos-en-las-busquedas-con-sql-server"&gt;Cómo ignorar los acentos en SQL Server&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;¡Hasta pronto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-3966098366045890629?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/3966098366045890629/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=3966098366045890629' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3966098366045890629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3966098366045890629'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2008/07/mi-nuevo-blog-en-avanzis.html' title='Mi nuevo blog en Avanzis'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-5411523969173127184</id><published>2008-04-10T14:04:00.001+02:00</published><updated>2008-04-10T14:04:19.173+02:00</updated><title type='text'>Mejorar rendimiento y reducir consumo de Memoria en Vista</title><content type='html'>&lt;p&gt;2GB de memoria no son suficientes para desarrollar en Visual Studio y tener Aero de Vista activado. &lt;/p&gt;  &lt;p&gt;Me he decidido a desactivar Aero, y aqu&amp;#237; por si alguien m&amp;#225;s necesita hacerlo:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Panel de control &amp;gt; Sistema y mantenimiento &amp;gt; Informaci&amp;#243;n y herramientas de rendimiento&lt;/li&gt;    &lt;li&gt;En la parte derecha, seleccionar: &amp;quot;Ajustar efectos visuales&amp;quot;&lt;/li&gt;    &lt;li&gt;Desactivar la casilla &amp;quot;Habilitar la composici&amp;#243;n de escritorio&amp;quot;.&lt;/li&gt;    &lt;li&gt;Y pulsar sobre &amp;quot;Aceptar&amp;quot;.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ahora Vista parecer&amp;#225; un poco m&amp;#225;s feo, pero en mi caso el proceso dwm.exe ha pasado de consumir 86MB a consumir 4MB.&lt;/p&gt;  &lt;p&gt;Merece la pena.&lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;  &lt;p&gt;Richard&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-5411523969173127184?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/5411523969173127184/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=5411523969173127184' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/5411523969173127184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/5411523969173127184'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2008/04/mejorar-rendimiento-y-reducir-consumo.html' title='Mejorar rendimiento y reducir consumo de Memoria en Vista'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-4659951541581614541</id><published>2008-04-07T17:35:00.001+02:00</published><updated>2008-04-07T17:35:48.346+02:00</updated><title type='text'>TryToGetValue en diccionarios genéricos</title><content type='html'>&lt;p&gt;Hasta ahora casi siempre que quer&amp;#237;a obtener el valor de en un diccionario para una cierta palabra clave, primero hac&amp;#237;a la comprobaci&amp;#243;n de que esa palabra clave existe para evitar que se lanzaran excepciones.&lt;/p&gt;  &lt;p&gt;Un ejemplo sin mucho sentido::&lt;/p&gt;  &lt;blockquote&gt;   &lt;div style="font-family: courier new"&gt;Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt; values =&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt;();&amp;#160;&amp;#160; &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; key = &lt;span style="color: maroon"&gt;&amp;quot;clave&amp;quot;&lt;/span&gt;;&amp;#160; &lt;br /&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt; value = &lt;span style="color: maroon"&gt;0&lt;/span&gt;;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (values.ContainsKey(key))&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; value = values[key];&amp;#160;&amp;#160; &lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;Si no se hace esta comprobaci&amp;#243;n y se intenta acceder a un elemento de la colecci&amp;#243;n que no existe, lanzar&amp;#225; una excepci&amp;#243;n.&lt;/p&gt;  &lt;p&gt;Navegando entre las propiedades de una colecci&amp;#243;n gen&amp;#233;rica he encontrado por casualidad el m&amp;#233;todo &amp;quot;TryToGetValue()&amp;quot; que puede ayudar a tener un c&amp;#243;digo m&amp;#225;s elegante ya que no hace falta comprobar cada vez si el &amp;#237;ndice existe.&lt;/p&gt;  &lt;blockquote&gt;   &lt;div style="font-family: courier new"&gt;Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt; values = &lt;/div&gt;    &lt;div style="font-family: courier new"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt;();&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; key = &lt;span style="color: maroon"&gt;&amp;quot;clave&amp;quot;&lt;/span&gt;;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt; value = &lt;span style="color: maroon"&gt;0&lt;/span&gt;;&amp;#160; &lt;br /&gt;      &lt;br /&gt;value.TryToGetValue(key, &lt;span style="color: blue"&gt;out&lt;/span&gt; value); &lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;Saludos!&lt;/p&gt;  &lt;p&gt;Richard.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-4659951541581614541?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/4659951541581614541/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=4659951541581614541' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/4659951541581614541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/4659951541581614541'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2008/04/trytogetvalue-en-diccionarios-genricos.html' title='TryToGetValue en diccionarios genéricos'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-3568687822898195358</id><published>2008-03-14T17:03:00.001+01:00</published><updated>2008-03-14T17:03:24.282+01:00</updated><title type='text'>Cómo hacer que el Url Rewriting en IIS 7 funcione como en IIS 6</title><content type='html'>&lt;p&gt;Comenzamos a probar nuestras aplicaciones con IIS 7 y me he llevado una alegr&amp;#237;a al comprobar que por fin se pueden configurar y ejecutar m&amp;#250;ltiples sitios web en Window Vista.&lt;/p&gt;  &lt;p&gt;De acuerdo, eso est&amp;#225; muy bien, pero ahora tengo que conseguir configurar el IIS 7 para que funcione la redirecci&amp;#243;n de URLs que tenemos programado en ASP.NET. &lt;/p&gt;  &lt;p&gt;Por suerte no he sido el primero:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.improve.dk/blog/2006/12/11/making-url-rewriting-on-iis7-work-like-iis6" href="http://www.improve.dk/blog/2006/12/11/making-url-rewriting-on-iis7-work-like-iis6"&gt;http://www.improve.dk/blog/2006/12/11/making-url-rewriting-on-iis7-work-like-iis6&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Mark Rasmussen nos explica paso a paso c&amp;#243;mo lo ha configurado y los errores que se ha encontrado por el camino. &amp;#161;Gracias Mark!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-3568687822898195358?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/3568687822898195358/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=3568687822898195358' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3568687822898195358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3568687822898195358'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2008/03/cmo-hacer-que-el-url-rewriting-en-iis-7.html' title='Cómo hacer que el Url Rewriting en IIS 7 funcione como en IIS 6'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-3996489631708203453</id><published>2008-02-12T21:35:00.001+01:00</published><updated>2008-02-12T21:35:32.717+01:00</updated><title type='text'>Múltiples sitios web en una solución de Visual Studio 2008</title><content type='html'>&lt;p&gt;Cuando tienes en una soluci&amp;#243;n que contiene varios proyectos web y quieres depurar, Visual Studio 2008 por defecto te abre un servidor web para cada uno de ellos.&lt;/p&gt;  &lt;p&gt;Esto resulta muy inc&amp;#243;modo cuando s&amp;#243;lo quieres depurar un &amp;#250;nico proyecto. Para cambiar ese comportamiento y que s&amp;#243;lo arranque el servidor web que est&amp;#225;s depurando, tienes tienes que seleccionar cada uno de los otros proyectos y en sus propiedades (las que salen generalmente abajo a la derecha, pulsando la tecla F4), cambiar &amp;quot;Always Start When Debugging&amp;quot; a &amp;quot;False&amp;quot;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-3996489631708203453?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/3996489631708203453/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=3996489631708203453' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3996489631708203453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3996489631708203453'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2008/02/mltiples-sitios-web-en-una-solucin-de.html' title='Múltiples sitios web en una solución de Visual Studio 2008'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-5847774631655639396</id><published>2007-09-24T19:40:00.001+02:00</published><updated>2007-09-24T19:40:54.853+02:00</updated><title type='text'>Utilizando 'sp_msforeachdb'</title><content type='html'>&lt;p&gt;Hoy quería hacer una consulta en más de 20 bases de datos de forma simultánea de un servidor SQL. &lt;/p&gt; &lt;p&gt;Una opción era abrir cada una de las bases de datos, crear una nueva consulta, y ejecutarla para ver los resultados. Bueno, no es demasiado trabajo, pero ¿y si quiero modificar los parámetros de la consulta? Demasiado trabajo.&lt;/p&gt; &lt;p&gt;Por suerte, SQL Server 2005 (y no sé si el 2000 y anteriores) tiene un procedimiento almacenado no documentado que te permite ejecutar una consulta para todas las bases de datos de un servidor.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;sp_msforeachdb&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Aquí tenéis un ejemplo de utilización que además comprueba que la tabla de la base datos que voy a consultar exista para evitar errores:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;exec&lt;/span&gt; sp_msforeachdb &lt;span class="str"&gt;'use [?];&lt;br /&gt;            if Exists(SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='&lt;/span&gt;&lt;span class="str"&gt;'BASE TABLE'&lt;/span&gt;&lt;span class="str"&gt;' AND TABLE_NAME='&lt;/span&gt;&lt;span class="str"&gt;'nombre_de_tabla'&lt;/span&gt;&lt;span class="str"&gt;')&lt;br /&gt;            BEGIN&lt;br /&gt;                select '&lt;/span&gt;&lt;span class="str"&gt;'?'&lt;/span&gt;&lt;span class="str"&gt;' as DatabaseName, * from nombre_de_tabla;&lt;/span&gt;&lt;span class="str"&gt;&lt;br /&gt;            END;'&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;El signo de interrogación se sustituye de forma automática por el nombre de la base de datos en la que se está ejecutando la instrucción.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Espero que os resulte tan útil como a mí.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;¡Hasta pronto!&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-5847774631655639396?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/5847774631655639396/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=5847774631655639396' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/5847774631655639396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/5847774631655639396'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2007/09/utilizando.html' title='Utilizando &amp;#39;sp_msforeachdb&amp;#39;'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-6344007315940967695</id><published>2007-08-16T18:17:00.001+02:00</published><updated>2007-08-16T18:19:50.648+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='visual studio c#'/><title type='text'>Aumentar el número de descargas simultáneas de Firefox</title><content type='html'>&lt;p&gt;Hoy he intentado descargarme con Firefox la imagen de Virtual PC de la &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=8450EFF5-24AD-44C3-AB91-1ED88EF2F4F0&amp;amp;displaylang=en" target="_blank"&gt;nueva beta de Visual Studio 2008 Team System&lt;/a&gt;. ¡Esta beta son 9 archivos de 700 megas cada uno!&lt;/p&gt; &lt;p&gt;Firefox&amp;nbsp;no te permite descargar más de 2 archivos del mismo servidor de forma simultánea por defecto, pero sí que puedes cambiar este parámetro modificando la configuración avanzada.&lt;/p&gt; &lt;p&gt;Para ello:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Introduce en la barra de direcciones de Firefox: &lt;em&gt;about:config&lt;/em&gt;&lt;br&gt;Te aparecerán todas las opciones de configuración de Firefox.&lt;/li&gt; &lt;li&gt;El parámetro que controla las descargas simultáneas se llama &lt;em&gt;network.http.max-persistent-connections-per-server&lt;/em&gt;.&lt;br&gt;Para localizarlo puedes usar el filtro que ofrece Firefox en la parte superior.&lt;/li&gt; &lt;li&gt;Modifica el parámetro al número que te haga falta (en mi caso 10).&lt;/li&gt; &lt;li&gt;No hace falta ni reiniciar, así que puedes comenzar con el resto de descargas.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Te recomiendo que una vez que termines las descargas, lo dejes como estaba, ya que supongo que esta limitación estará así por algún motivo.&lt;/p&gt; &lt;p&gt;¡Felices descargas!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-6344007315940967695?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/6344007315940967695/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=6344007315940967695' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/6344007315940967695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/6344007315940967695'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2007/08/aumentar-el-nmero-de-descargas.html' title='Aumentar el número de descargas simultáneas de Firefox'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-2174084647739560647</id><published>2007-06-20T12:48:00.001+02:00</published><updated>2007-06-20T12:48:29.704+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>El control Wizard y OnPreRender</title><content type='html'>&lt;p&gt;Hoy por casualidad he descubierto que cuando utilizas un wizard (y supongo que también en un MultiView), todos los controles que están dentro de los WizardSteps realizan el evento OnLoad, pero sólo el control que está dentro del WizardStep activo realiza el evento OnPreRender.&lt;/p&gt; &lt;p&gt;Me ha resultado algo curioso, pero es lógico, ya que supongo que lo que hace el Multiview es marcar los controles que no están en el paso activo como invisibles.&lt;/p&gt; &lt;p&gt;¡A seguir aprendiendo!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-2174084647739560647?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/2174084647739560647/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=2174084647739560647' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/2174084647739560647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/2174084647739560647'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2007/06/el-control-wizard-y-onprerender.html' title='El control Wizard y OnPreRender'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-2293362448238287911</id><published>2007-06-13T10:36:00.001+02:00</published><updated>2007-06-20T12:51:12.147+02:00</updated><title type='text'>Compresión HTTP en ASP.NET 2.0</title><content type='html'>&lt;p&gt;El otro día estaba buscando cómo activar la compresión Http en el IIS. Parecía algo sencillo, bastaba con&amp;nbsp;activar la compresión para páginas dinámicas y decirle&amp;nbsp;cuales eran las extensiones de los archivos que debería comprimir.&amp;nbsp;&lt;/p&gt; &lt;p&gt;Pues nada manos a la obra:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Compruebo el tamaño de dos páginas antes de comprimir, una estática y&amp;nbsp;una página aspx.  &lt;li&gt;Configuro el IIS para que active la compresión.  &lt;li&gt;Compruebo el tamaño de&amp;nbsp;la página estática y de la página en ASPX y en su conjunto se ha reducido el tamaño&amp;nbsp;en una cuarta parte. ¡Bien!  &lt;li&gt;Sólo por seguridad, compruebo que también comprime la misma página .aspx pero accediendo a una url sin extensión utilizando &lt;a href="http://msdn2.microsoft.com/en-us/library/ms972974.aspx" target="_blank"&gt;Url Rewrite&lt;/a&gt;&amp;nbsp;y... ¡No funciona!&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Y por mucho que lo intenté, no conseguí que el IIS me comprimiera estas las páginas sin extensión. Por suerte, dio la casualidad de había estado revisando un proyecto de blogs - &lt;a href="http://www.dotnetblogengine.net/"&gt;blogengine.net&lt;/a&gt;&amp;nbsp;- y había visto que utilizaban un &lt;a href="http://support.microsoft.com/kb/307996/es" target="_blank"&gt;módulo HTTP&lt;/a&gt; para la comprimir sus páginas. Así que, ¿por qué no intentarlo?&lt;/p&gt; &lt;p&gt;Aquí tenéis el código de ese módulo Http con algunas pequeñas variaciones. El mérito por supuesto es de los autores de blogengine.net.&lt;/p&gt; &lt;div style="font-size: 8pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Compresses the output using standard gzip/deflate.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HttpCompressionModule&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IHttpModule&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp; &amp;nbsp; #region&lt;/span&gt; IHttpModule Members&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Disposes of the resources (other than memory) used by the module &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; that implements &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;see cref="T:System.Web.IHttpModule"&amp;gt;&amp;lt;/see&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;void&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHttpModule&lt;/span&gt;.Dispose()&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: green"&gt;// Nothing to dispose; &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Initializes a module and prepares it to handle requests.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name="context"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;An &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;see cref="T:System.Web.HttpApplication"&amp;gt;&amp;lt;/see&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; that provides access to the methods, properties, and events common to &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; all application objects within an ASP.NET application.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;void&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHttpModule&lt;/span&gt;.Init(&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt; context)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;PortalSettings&lt;/span&gt;.EnableHttpCompression)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; context.BeginRequest += &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(context_BeginRequest);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp; &amp;nbsp; #endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp; &amp;nbsp; #region&lt;/span&gt; Compression&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;const&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GZIP = &lt;span style="color: #a31515"&gt;"gzip"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;const&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; DEFLATE = &lt;span style="color: #a31515"&gt;"deflate"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Handles the BeginRequest event of the context control.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name="sender"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;The source of the event.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name="e"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;The &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;see cref="System.EventArgs"/&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt; instance containing the event data.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;void&lt;/span&gt; context_BeginRequest(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt; app = sender &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (CanCompressUrl(app.Request.Url.OriginalString.ToUpperInvariant()))&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (IsEncodingAccepted(DEFLATE))&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; app.Response.Filter = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DeflateStream&lt;/span&gt;(app.Response.Filter, &lt;span style="color: #2b91af"&gt;CompressionMode&lt;/span&gt;.Compress);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SetEncoding(DEFLATE);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (IsEncodingAccepted(GZIP))&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; app.Response.Filter = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GZipStream&lt;/span&gt;(app.Response.Filter, &lt;span style="color: #2b91af"&gt;CompressionMode&lt;/span&gt;.Compress);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SetEncoding(GZIP);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; CanCompressUrl(&lt;span style="color: blue"&gt;string&lt;/span&gt; url)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; (url.Contains(&lt;span style="color: #a31515"&gt;".ASPX"&lt;/span&gt;) || url.EndsWith(&lt;span style="color: #a31515"&gt;".CSS"&lt;/span&gt;) || url.EndsWith(&lt;span style="color: #a31515"&gt;".JS"&lt;/span&gt;));&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Checks the request headers to see if the specified&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; encoding is accepted by the client.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; IsEncodingAccepted(&lt;span style="color: blue"&gt;string&lt;/span&gt; encoding)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Request.Headers[&lt;span style="color: #a31515"&gt;"Accept-encoding"&lt;/span&gt;] != &lt;span style="color: blue"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Request.Headers[&lt;span style="color: #a31515"&gt;"Accept-encoding"&lt;/span&gt;].Contains(encoding);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Adds the specified encoding to the response headers.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name="encoding"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; SetEncoding(&lt;span style="color: blue"&gt;string&lt;/span&gt; encoding)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Response.AppendHeader(&lt;span style="color: #a31515"&gt;"Content-encoding"&lt;/span&gt;, encoding);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp; &amp;nbsp; #endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Recordad que para&amp;nbsp;activarlo en vuestra web, es necesario indicar en el web.config algo como esto:&lt;/p&gt;&lt;br /&gt;&lt;div style="font-size: 8pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;HttpCompressionModule&lt;/span&gt;"&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Avanzis.Helpers.HttpModules.HttpCompressionModule, Avanzis.Helpers.HttpModules&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Editado (20/06/2007)&lt;/strong&gt;: No utilicéis este módulo en producción ya que en ocasiones da problemas y muestra caracteres extraños. Es un comportamiento aleatorio por lo que aún no he podido descubrir el motivo.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-2293362448238287911?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/2293362448238287911/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=2293362448238287911' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/2293362448238287911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/2293362448238287911'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2007/06/compresin-http-en-aspnet-20.html' title='Compresión HTTP en ASP.NET 2.0'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-2504106524777540346</id><published>2007-05-30T20:11:00.001+02:00</published><updated>2007-05-30T20:11:21.953+02:00</updated><title type='text'>Instalar múltiples versiones de Internet Explorer</title><content type='html'>&lt;p&gt;No todos los usuarios tienen la última versión de Internet explorer (la versión, 7 para los más despistados), y las webs no se ven iguales entre versiones distintas de este navegador, por lo que no si desarrollas para la web no puedes olvidarte de versiones anteriores.&lt;/p&gt; &lt;p&gt;Por suerte he encontrado esta pequeño programa:&lt;/p&gt; &lt;p&gt;&lt;a href="http://tredosoft.com/Multiple_IE"&gt;Enlace a 'Install multiple versions of IE on your PC | TredoSoft&lt;/a&gt;' &lt;/p&gt; &lt;p&gt;que te permite instalar múltiples versiones de Internet Explorer desde 3.0 a la 6.0. &lt;/p&gt; &lt;p&gt;Imprescindible.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-2504106524777540346?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/2504106524777540346/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=2504106524777540346' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/2504106524777540346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/2504106524777540346'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2007/05/instalar-mltiples-versiones-de-internet.html' title='Instalar múltiples versiones de Internet Explorer'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-8664937400575497845</id><published>2007-05-30T11:45:00.001+02:00</published><updated>2007-05-30T11:46:24.906+02:00</updated><title type='text'>Cómo mantener el valor de un TextBox con TextMode = Password</title><content type='html'>&lt;p&gt;Hoy he descubierto como introducir el valor en un textbox que está funcionando con TextMode="Password".&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="txtPassword"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;TextMode&lt;/span&gt;&lt;span class="kwrd"&gt;="Password"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;El problema es que por servidor, esto no funciona:&lt;/p&gt;&lt;br /&gt;&lt;div style="font-size: 8pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;txtPassword.Text = &lt;span style="color: #a31515"&gt;"1234"&lt;/span&gt;;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;E control aparece en blanco, da igual en el momento del ciclo de vida que lo hagas. Y no sólo eso, además el control pierde el valor en cuanto se produce un postback algo que resulta realmente incómodo para los usuarios.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;La solución la encontré en este &lt;a href="http://ryanfarley.com/blog/archive/2004/12/18/1300.aspx" target="_blank"&gt;post&lt;/a&gt;&amp;nbsp;y consiste en asignar el valor que queremos que teme el control como un atributo. Si además queremos que la clave se mantenta entre Postbacks, bastará con que asignemos el valor cada vez que recarga la página:&lt;/p&gt;&lt;br /&gt;&lt;div style="font-size: 8pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; txtPassword.Attributes.Add(&lt;span style="color: #a31515"&gt;"value"&lt;/span&gt;, txtPassword.Text);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-8664937400575497845?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/8664937400575497845/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=8664937400575497845' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/8664937400575497845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/8664937400575497845'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2007/05/cmo-mantener-el-valor-de-un-textbox-con.html' title='Cómo mantener el valor de un TextBox con TextMode = Password'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-3484002111859567004</id><published>2007-05-28T13:05:00.001+02:00</published><updated>2007-05-28T13:05:33.916+02:00</updated><title type='text'>Mayúsculas y minúsculas en CSS</title><content type='html'>&lt;p&gt;Hasta ahora creía que no importaban las mayúsculas y minúsculas en los estilos CSS, pero esta mañana me he dado cuenta de que sí que importan en ciertos casos. En concreto, si el documento es XHTML y tiene el doctype adecuado, las mayúsculas sí que las tienen en cuenta el navegador y por ejemplo el estilo 'title' es distinto de 'Title' o de 'TITLE'.&lt;/p&gt; &lt;p&gt;Como regla general, hemos optado por utilizar la nomenclatura pascal para los estilos, es decir, poner la primera letra de cada palabra en mayúscula.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-3484002111859567004?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/3484002111859567004/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=3484002111859567004' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3484002111859567004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3484002111859567004'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2007/05/maysculas-y-minsculas-en-css.html' title='Mayúsculas y minúsculas en CSS'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-3113398992898459267</id><published>2007-05-24T19:48:00.001+02:00</published><updated>2007-05-24T19:48:09.492+02:00</updated><title type='text'>if (control.Enabled = true)  XHTML Strict Valid = false</title><content type='html'>&lt;p&gt;Si en ASP.NET le indicas que a un control (yo al menos lo he probado con el HyperLink) que no está habilitado, es decir control.Enabled = false, el código generado XHTML incluye un atributo disabled="disabled" lo que provoca que no supere la validación XHTML Strict.&lt;/p&gt; &lt;p&gt;Este es el error:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;You have used the attribute named above in your document, but the document type you are using does not support that attribute for this element. This error is often caused by incorrect use of the "Strict" document type with a document that uses frames (e.g. you must use the "Transitional" document type to get the "target" attribute), or by using vendor proprietary extensions such as "marginheight" (this is usually fixed by using CSS to achieve the desired effect instead). This error may also result if the element itself is not supported in the document type you are using, as an undefined element will have no supported attributes; in this case, see the element-undefined error message for further information. &lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-3113398992898459267?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/3113398992898459267/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=3113398992898459267' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3113398992898459267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3113398992898459267'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2007/05/if-controlenabled-true-xhtml-strict.html' title='if (control.Enabled = true)  XHTML Strict Valid = false'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-3909645910623158832</id><published>2007-05-24T18:43:00.001+02:00</published><updated>2007-05-24T18:44:51.727+02:00</updated><title type='text'>Cuidado con WriteBeginTag, mejor RenderBeginTag</title><content type='html'>&lt;p&gt;Hoy he pasado el test XHTML a una de nuestras páginas y, ¡sorpresa!, no lo superaba. Entre otros fallos descubrí que un control de imagen que habíamos implementado no estaba generando el código HTML correctamente. &lt;/p&gt; &lt;p&gt;Este era el código que utilizaba inicialmente al renderizar el control:&lt;/p&gt; &lt;div style="font-size: 8pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Render(&lt;span style="color: #2b91af"&gt;HtmlTextWriter&lt;/span&gt; writer)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; writer.WriteBeginTag(&lt;span style="color: #a31515"&gt;"img"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; writer.WriteAttribute(&lt;span style="color: #a31515"&gt;"src"&lt;/span&gt;, imageSrc);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;.PhotoSize != &lt;span style="color: #2b91af"&gt;PhotoSizes&lt;/span&gt;.Default)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.WriteAttribute(&lt;span style="color: #a31515"&gt;"width"&lt;/span&gt;, currentSize.Width.ToString());&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.WriteAttribute(&lt;span style="color: #a31515"&gt;"height"&lt;/span&gt;, currentSize.Height.ToString());&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; writer.WriteAttribute(&lt;span style="color: #a31515"&gt;"alt"&lt;/span&gt;, &lt;span style="color: blue"&gt;this&lt;/span&gt;.UserName);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; writer.WriteEndTag(&lt;span style="color: #a31515"&gt;"img"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;base&lt;/span&gt;.Render(writer);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Al tratarse de algo tan simple, no comprobé que código HTML generado fuera correcto. Este es un ejemplo&amp;nbsp;del código HTML generado:&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;img src="/imgs/nofoto48x48.gif" width="48" height="48" alt="jherrerave"&amp;lt;/img&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Como podéis comprobar, no cerraba correctamente la etiqueta de la imagen y por supuesto no superaba el test de XHTML.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Para solucionarlo investigué un poco, y eso, junto con la ayuda de Josep, convirtió el código antiguo en este nuevo que sí renderiza correctamente:&lt;/p&gt;&lt;br /&gt;&lt;div style="font-size: 8pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Render(&lt;span style="color: #2b91af"&gt;HtmlTextWriter&lt;/span&gt; writer)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; writer.AddAttribute(&lt;span style="color: #2b91af"&gt;HtmlTextWriterAttribute&lt;/span&gt;.Src, imageSrc);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;.PhotoSize != &lt;span style="color: #2b91af"&gt;PhotoSizes&lt;/span&gt;.Default)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.AddAttribute(&lt;span style="color: #2b91af"&gt;HtmlTextWriterAttribute&lt;/span&gt;.Width, currentSize.Width.ToString());&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.AddAttribute(&lt;span style="color: #2b91af"&gt;HtmlTextWriterAttribute&lt;/span&gt;.Height, currentSize.Height.ToString());&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; writer.AddAttribute(&lt;span style="color: #2b91af"&gt;HtmlTextWriterAttribute&lt;/span&gt;.Alt, &lt;span style="color: blue"&gt;this&lt;/span&gt;.UserName);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; writer.RenderBeginTag(&lt;span style="color: #2b91af"&gt;HtmlTextWriterTag&lt;/span&gt;.Img);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; writer.RenderEndTag();&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;base&lt;/span&gt;.Render(writer);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;La verdad, es que el código es bastante raro porque primero se añaden los atributos y luego se utiliza el RenderBeginTag y el RenderEndTag. Además, en vez de utilizar 'Magic Words' como podrán ser los nombres de los atributos se utiliza una enumeración que siempre genera código más elegante.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Por supuesto el XHTML resultante ahora es el correcto:&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;img src="/imgs/nofoto48x48.gif" width="48" height="48" alt="jherrerave" /&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-3909645910623158832?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/3909645910623158832/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=3909645910623158832' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3909645910623158832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3909645910623158832'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2007/05/cuidado-con-writebegintag-mejor.html' title='Cuidado con WriteBeginTag, mejor RenderBeginTag'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-6650523062229866783</id><published>2007-05-21T18:46:00.001+02:00</published><updated>2007-05-21T18:53:27.103+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio c#'/><title type='text'>Buscar y reemplazar en Visual Studio.NET usando expresiones regulares</title><content type='html'>&lt;div&gt;En ocasiones es muy útil poder buscar y reemplazar en Visual Studio.Net usando expresiones regulares. Hasta ahora no lo había intentado pero visto lo fácil que es, seguro que voy a usarlo más veces.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Por ejemplo, tenía una url del tipo &lt;em&gt;/ayuda/default.aspx?pagina=nombre_pagina&lt;/em&gt; y quería cambiarla por algo del estio &lt;em&gt;/ayuda/nombre_pagina&lt;/em&gt;. Pues muy fácil, sólo tenemos que buscar y reemplazar con las opciones que se muestran en la imagen: &lt;/div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_RLg2D71TqWs/RlHOcPdG9qI/AAAAAAAAAA0/AXr8lvWZ8VE/s1600-h/searchandreplaceregex.gif"&gt;&lt;img id="BLOGGER_PHOTO_ID_5067058040348800674" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_RLg2D71TqWs/RlHOcPdG9qI/AAAAAAAAAA0/AXr8lvWZ8VE/s400/searchandreplaceregex.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Fijaos que en "Find what", he indicado entre llaves aquello a lo que quiereo hacer referencia en "Replace width", y que para hacer la referencia se utiliza '\1'. Si existieran otras referencias, se harían por posición \2, \3, \4, etc...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-6650523062229866783?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/6650523062229866783/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=6650523062229866783' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/6650523062229866783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/6650523062229866783'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2007/05/buscar-y-reemplazar-en-visual-studionet.html' title='Buscar y reemplazar en Visual Studio.NET usando expresiones regulares'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RLg2D71TqWs/RlHOcPdG9qI/AAAAAAAAAA0/AXr8lvWZ8VE/s72-c/searchandreplaceregex.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-3724420699554493945</id><published>2007-05-21T13:58:00.001+02:00</published><updated>2007-05-21T13:58:18.393+02:00</updated><title type='text'>El poder de FindControl</title><content type='html'>&lt;p&gt;Convirtiendo un viejo código de ASP a ASP.NET me encontré con un montón de 'switch's incrustados en el código del aspx. Quería convertirlo a paneles que se ocultaran o mostraban en función de un parámetro del QueryString, eso significaba volver a hacer el switch para cada uno de los paneles.&lt;/p&gt; &lt;p&gt;Por suerte, se me ocurrió utilizar la función FindControl que te permite buscar un control dentro de un contendor. Así, nombrando los paneles igual que los valores que se pasaban en el QueryString, el código me ha quedado mucho más limpio y es&amp;nbsp;más escalable.&lt;/p&gt; &lt;div style="font-size: 8pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;string&lt;/span&gt; pageName = Request.QueryString[&lt;span style="color: #a31515"&gt;"pregunta"&lt;/span&gt;];&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.IsNullOrEmpty(pageName))&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pageName = pageName.ToLower();&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;string&lt;/span&gt; panelName = pageName;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af"&gt;Control&lt;/span&gt; pnl = (&lt;span style="color: #2b91af"&gt;Control&lt;/span&gt;) pnlHelpPage.FindControl(panelName);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (pnl != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pnl.Visible = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pnlHelpPage.Visible = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pnlHelpPage.Visible = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pnlHelpPage.Visible = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-3724420699554493945?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/3724420699554493945/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=3724420699554493945' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3724420699554493945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/3724420699554493945'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2007/05/el-poder-de-findcontrol.html' title='El poder de FindControl'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-7521490035981499421</id><published>2007-05-18T15:02:00.001+02:00</published><updated>2007-05-18T15:08:25.186+02:00</updated><title type='text'>Redirecciones amigables para Google - Redirección 301</title><content type='html'>&lt;p&gt;Google es el buscador por excelencia y por ello es conveniente seguir sus recomendaciones. Uno de sus consejos es redireccionar utilizando la redirección de tipo 301.&amp;nbsp;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div style="font-size: 8pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Redirige a la una página, teniendo en cuenta la redicción 301 que le gusta a Google&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name="targetUrl"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;La redireccion de destino&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name="endResponse"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;True si debe finalizar la ejecución&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Redirect301(&lt;span style="color: blue"&gt;string&lt;/span&gt; targetUrl, &lt;span style="color: blue"&gt;bool&lt;/span&gt; endResponse)&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Response.Status = &lt;span style="color: #a31515"&gt;"301 Moved Permanently"&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Response.StatusCode = 301;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af"&gt;StringBuilder&lt;/span&gt; sb = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StringBuilder&lt;/span&gt;();&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (targetUrl.IndexOf(&lt;span style="color: #a31515"&gt;"://"&lt;/span&gt;) &amp;lt; 0)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; targetUrl = targetUrl.Replace(&lt;span style="color: #a31515"&gt;"~"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;""&lt;/span&gt;);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sb.Append(&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Request.Url.Scheme);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sb.Append(&lt;span style="color: #a31515"&gt;"://"&lt;/span&gt;);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sb.Append(&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Request.Url.Authority);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sb.Append(targetUrl);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sb.Append(targetUrl);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;string&lt;/span&gt; destinationUrl = sb.ToString();&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Response.AddHeader(&lt;span style="color: #a31515"&gt;"Location"&lt;/span&gt;, destinationUrl);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (endResponse)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Response.End();&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-7521490035981499421?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/7521490035981499421/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=7521490035981499421' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/7521490035981499421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/7521490035981499421'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2007/05/redirecciones-amigables-para-google.html' title='Redirecciones amigables para Google - Redirección 301'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-113647641855792643</id><published>2006-01-05T16:53:00.000+01:00</published><updated>2006-01-05T16:53:38.606+01:00</updated><title type='text'>Clase básica para todas las páginas en ASP.NET 2.0</title><content type='html'>Un pequeño y útil descubrimiento: Es posible heredar todas las páginas de una clase básica con sólo modificar el Web.config. También es posible incluir de forma predeterminada los "using" necesarios.&lt;br /&gt;&lt;br /&gt;En el siguiente artículo explican cómo hacerlo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ryanfarley.com/blog/archive/2004/06/08/766.aspx"&gt;Awesome web.config Changes in ASP.NET 2.0&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-113647641855792643?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/113647641855792643/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=113647641855792643' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113647641855792643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113647641855792643'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2006/01/clase-bsica-para-todas-las-pginas-en.html' title='Clase básica para todas las páginas en ASP.NET 2.0'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-113637886223092011</id><published>2006-01-04T13:47:00.000+01:00</published><updated>2006-01-04T13:47:42.270+01:00</updated><title type='text'>Editar y continuar limitado en ASP.NET 2.0 con C#</title><content type='html'>Cuando me enteré que en C# iba a ser posible editar y continuar mientras estabas depurando me llevé una de las mayores alegrías que puede tener un programador. Pero las grandes alegrías también tran grandes desilusiones.&lt;br /&gt;&lt;br /&gt;Sólo es posible editar y continuar en aplicaciones Windows Forms y en el código ASPX de las páginas de ASP.NET, dejando fuera el caso con el que más trabajo: los archivos Codebehind de las páginas ASPX.&lt;br /&gt;&lt;br /&gt;Existe otra limitación en ASP.NET que aunque no es tan importante es muy molesta. Cuando estás depurando no es posible modificar el código la página web en modo diseño, tienes que pasar a ver el código HTML y hacer todas las modificaciones "a mano".&lt;br /&gt;&lt;br /&gt;Espero que Microsoft pueda solucionar todo esto en su próxima versión de VS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-113637886223092011?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/113637886223092011/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=113637886223092011' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113637886223092011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113637886223092011'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2006/01/editar-y-continuar-limitado-en-aspnet.html' title='Editar y continuar limitado en ASP.NET 2.0 con C#'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-113637156684196297</id><published>2006-01-04T11:46:00.000+01:00</published><updated>2006-01-04T11:48:42.213+01:00</updated><title type='text'>ConnectionStrings en el Web.config</title><content type='html'>El archivo web.config de ASP.net 2.0 tiene una sección dedicada a introducir las cadenas de conexión a bases de datos. Estas cadenas de conexión pueden ser utilizadas tanto por los controles fuentes de datos (como SqlDataSource) como por el código.&lt;br /&gt;&lt;br /&gt;Para utilizar estas cadenas de conexión desde código podemos utilizar el objeto ConfigurationManager:&lt;br /&gt;&lt;br /&gt;&lt;span style="text-align: left;font-family:Courier New;font-size:85%;"  &gt;SqlConnection conn = new SqlConnection( ConfigurationManager.ConnectionStrings["MiConnectionString"].ConnectionString );&lt;/span&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/jgaylord/archive/2005/05/12/406639.aspx"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-113637156684196297?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/113637156684196297/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=113637156684196297' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113637156684196297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113637156684196297'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2006/01/connectionstrings-en-el-webconfig_04.html' title='ConnectionStrings en el Web.config'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-113622162742947008</id><published>2006-01-02T18:07:00.000+01:00</published><updated>2006-01-02T18:07:18.776+01:00</updated><title type='text'>Complejidad de la clave de los usuarios en ASP.NET 2.0</title><content type='html'>Cuanto utilizas el proveedor de usuarios por defecto en ASP.NET (AspNetSqlMembershipProvider) viene configurado con unas reglas para claves muy estrictas. Cambiarlo esto no es inmediato ya que es necesario editar el web.config, crear la sección &lt;membership&gt; dentro de &lt;system.web&gt; y dentro de 'membership', eliminar y volver a añadir el proveedor por defecto.&lt;br /&gt;&lt;br /&gt;En la siguiente página se muestra como hacerlo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/owscott/archive/2005/05/11/406550.aspx"&gt;Changing the Password Complexity in ASP.NET V2.0&lt;/a&gt;&lt;/system.web&gt;&lt;/membership&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-113622162742947008?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/113622162742947008/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=113622162742947008' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113622162742947008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113622162742947008'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2006/01/complejidad-de-la-clave-de-los.html' title='Complejidad de la clave de los usuarios en ASP.NET 2.0'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-113620374460313817</id><published>2006-01-02T12:59:00.000+01:00</published><updated>2006-01-02T13:09:15.446+01:00</updated><title type='text'>Guía rápida para utilizar Master Pages en ASP.NET 2.0</title><content type='html'>Las páginas master en ASP.NET 2.0 sirven como plantillas. Las páginas que utilizen páginas master sólo podran editar ciertas regiones.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Crear la página máster, por ejemplo, 'WebActivation.master'.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Esta página tiene de especial que tiene una directiva de este tipo, en vez del clásico @Page.&lt;br /&gt;&lt;%@ Master Language="C#" AutoEventWireup="true" CodeFile="WebActivation.master.cs" Inherits="WebActivation" %&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Las regiones que se puede modificar estarán dentro de los controles asp:contentplaceholder, así que hay que añadir tantos asp:contentplaceholders como distintas regiones editables a la página Master.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Crear una página normal, por ejemplo, 'Default.aspx'&lt;/li&gt;&lt;li&gt;Añadir en la directiva @Page de la página creada el atributo MasterPageFile cuyo valor será el path a la página Master. Por ejemplo: MasterPageFile="~/WebActivation.master"&lt;/li&gt;&lt;li&gt;Borrar el resto de códito HTML de la página.&lt;/li&gt;&lt;li&gt;Para poder editar las regiones editables de la página master habrá que añadir controles asp:Content indicando en el atributo ContentPlaceHolderID el identificador de un asp:contentplaceholder que exista en la página master.&lt;/li&gt;&lt;li&gt;Añadir el contenido dentro del control asp:Content.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Con esto creo que es suficiente para utilizar las páginas Master.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-113620374460313817?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/113620374460313817/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=113620374460313817' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113620374460313817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113620374460313817'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2006/01/gua-rpida-para-utilizar-master-pages.html' title='Guía rápida para utilizar Master Pages en ASP.NET 2.0'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-113620317057518233</id><published>2006-01-02T12:46:00.000+01:00</published><updated>2006-01-02T13:10:15.690+01:00</updated><title type='text'>SQL Server 2005: ROW_NUMBER() y WITH</title><content type='html'>En SQL 2005 existe una nueva función llamada ROW_NUMBER() que te devuelve la posición de la fila devuelta dentro del orden que le indiques.&lt;br /&gt;&lt;br /&gt;Por ejemplo, la consulta:&lt;br /&gt;&lt;blockquote&gt; SELECT ROW_NUMBER() OVER (ORDER BY Puntos DESC) AS Posicion, Nombre,Puntos FROM Equipos&lt;/blockquote&gt;Nos devolvería los equipos de una liga ordenados de mayor a menor número de puntos conseguidos y su posición dentro de la clasificación.&lt;br /&gt;&lt;br /&gt;WITH es otra nueva característica que te permite crear resultados temporales de una consulta para luego utilizarlos. Si unimos esto característica con ROW_NUMBER() podemos paginar de forma sencilla.&lt;br /&gt;&lt;br /&gt;Este ejemplo muestra como podríamos obtener la clasificación por equipos de con la posición, donde @StartRowIndex indica la posición inicial y @NumRows el número de filas que se desea mostrar.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;WITH Clasificacion AS (&lt;br /&gt;SELECT ROW_NUMBER() OVER (ORDER BY Puntos DESC) AS Posicion, Nombre, Puntos FROM Equipos)&lt;br /&gt;&lt;br /&gt;SELECT Posicion, Nombre, Puntos&lt;br /&gt;FROM Clasificacion&lt;br /&gt;WHERE Posicion between @StartRowIndex and @StartRowIndex+@NumRows&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;En el próximo POST, una pequeña guía sobre cómo usar Master Pages en ASP.NET 2.0&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-113620317057518233?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/113620317057518233/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=113620317057518233' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113620317057518233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113620317057518233'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2006/01/sql-server-2005-rownumber-y-with.html' title='SQL Server 2005: ROW_NUMBER() y WITH'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-113620237369165951</id><published>2006-01-02T12:43:00.000+01:00</published><updated>2006-01-02T12:46:13.703+01:00</updated><title type='text'>Investigando .NET 2.0 y SQL Server 2005</title><content type='html'>Tengo un pequeño proyecto entre manos en los que voy a utilizar por primera vez ASP.NET 2.0. Cuando encuentre novedades y cosas "raras" que no estaban en la versión anterior, las colocaré como pequeños POSTs de este blog comentándolas y que sirvan de referencias futuras&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-113620237369165951?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/113620237369165951/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=113620237369165951' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113620237369165951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113620237369165951'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2006/01/investigando-net-20-y-sql-server-2005.html' title='Investigando .NET 2.0 y SQL Server 2005'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-113282431844288118</id><published>2005-11-24T10:25:00.000+01:00</published><updated>2005-11-24T10:25:45.526+01:00</updated><title type='text'>NUnit compatible con Visual Studio 2005</title><content type='html'>Durantes los últimos meses hemos puesto en marcha el desarrollo orientado a pruebas usando NUnit y TestDriven.net. Realmente ha sido un avance para producir software de mejor calidad en menor tiempo, ya que se reduce considerablemente los bugs durante todo el proceso de programación.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nunit.com/"&gt;La última versión de NUnit&lt;/a&gt; es compatible con Microsoft Visual Studio 2005 y .NET 2.0 así que cuando salga la versión en castellano, estaremos listos para comenzar a utilizarlo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-113282431844288118?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/113282431844288118/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=113282431844288118' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113282431844288118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113282431844288118'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/11/nunit-compatible-con-visual-studio.html' title='NUnit compatible con Visual Studio 2005'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-113224125117313275</id><published>2005-11-17T16:27:00.000+01:00</published><updated>2005-11-17T16:27:31.206+01:00</updated><title type='text'>Error en el connector MySQL/Net 1.06</title><content type='html'>Parece que existe algún error en el conector de MySql para .NET y por supuesto, siguiendo con la ley de Murphy, lo estamos sufriendo únicamente en el servidor de producción.&lt;br /&gt;&lt;br /&gt;Aquí hay un artículo que propone una solución:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/jezell/archive/2005/11/08/429883.aspx"&gt;MySQL .NET Connector Connection Pooling Bug&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-113224125117313275?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/113224125117313275/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=113224125117313275' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113224125117313275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113224125117313275'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/11/error-en-el-connector-mysqlnet-106.html' title='Error en el connector MySQL/Net 1.06'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-113223913031040700</id><published>2005-11-17T15:52:00.000+01:00</published><updated>2005-11-17T15:52:10.346+01:00</updated><title type='text'>Usar MySql 5.0 con ASP.NET</title><content type='html'>Un artículo muy interesante sobre cómo usar MySQL 5.0 y ASP.NET, incluyendo como llamar a procedimientos almacenados usando parámetros.&lt;br /&gt;&lt;br /&gt;El artículo &lt;a href="http://www.christianasp.net/articles/MySQL_Part_1.aspx"&gt;esta aquí&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-113223913031040700?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/113223913031040700/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=113223913031040700' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113223913031040700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/113223913031040700'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/11/usar-mysql-50-con-aspnet.html' title='Usar MySql 5.0 con ASP.NET'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-112988456130255991</id><published>2005-10-21T10:47:00.000+02:00</published><updated>2005-10-21T10:49:21.310+02:00</updated><title type='text'>Lanzamiento de Nhibernate 1.0</title><content type='html'>En uno de nuestros últimos proyectos estamos trabajando con NHibernate, la versión en .NET de Hibernate, un ORM (Object Relational Mapping).&lt;br /&gt;&lt;br /&gt;NHibernate ha llegado por fin a la versión 1.0 que se supone que cubre las funcionalidades de la versión 2.1 del proyecto Hibernate original.&lt;br /&gt;&lt;br /&gt;Además, aprovecho para recomendar un buen tutorial que nos ha ayudado a conocer un poco más este ORM:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.javahispano.org/articles.print.action?id=93"&gt;javaHispano. Introducción a Hibernate&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-112988456130255991?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/112988456130255991/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=112988456130255991' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112988456130255991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112988456130255991'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/10/lanzamiento-de-nhibernate-10.html' title='Lanzamiento de Nhibernate 1.0'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-112784894235722633</id><published>2005-09-27T21:22:00.000+02:00</published><updated>2005-09-27T21:22:59.560+02:00</updated><title type='text'>MySQL 5.0 Release Candidate</title><content type='html'>MySql 5.0 está ya en la versión "Release Candidate", una versión previa al lanzamiento de la definitiva. Es posible descargarla para tu versión de sistema operativo en el siguiente enlace:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/downloads/mysql/5.0.html"&gt;MySQL AB :: MySQL 5.0 Downloads&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Las principales novedades de MySql 5.0 son:&lt;br /&gt;&lt;br /&gt;- Vistas&lt;br /&gt;- Procedimientos almacenados&lt;br /&gt;- Triggers&lt;br /&gt;- Cursores&lt;br /&gt;&lt;br /&gt;Con estas nuevas características, MySql 5.0 ya se puede considerar una base de datos madura y con claro enfoque empresarial.&lt;br /&gt;&lt;br /&gt;En uno de nuestros proyectos más importantes estamos utilizando la versión 4.x y lleva funcionando más de dos años sin ningún problema, por lo que estoy seguro que MySql 5.0 es una apuesta segura para todo tipo de aplicaciones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-112784894235722633?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/112784894235722633/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=112784894235722633' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112784894235722633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112784894235722633'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/09/mysql-50-release-candidate.html' title='MySQL 5.0 Release Candidate'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-112730915731802762</id><published>2005-09-21T15:25:00.000+02:00</published><updated>2005-09-21T16:54:58.073+02:00</updated><title type='text'>Gestión de excepciones en Windows Forms y Logs</title><content type='html'>Cualquier aplicación debe dar una respuesta adecuada a los posibles excepciones que se produzcan en tiempo de ejecución. En Windows Forms, controlar las excepciones no controladas, es bastante sencillo gracias al evento Application.ThreadException.&lt;br /&gt;&lt;br /&gt;Esta forma de gestionar las excepciones no está mal, pero en uno de nuestros últimos desarrollos nos encontramos con el problema de tener varios hilos y si se producía una excepción no se gestionaba adecuadamente. Por suerte, Google acudió al rescate y en &lt;a href="http://weblogs.asp.net/fmarguerie/articles/403665.aspx"&gt;esta página&lt;/a&gt; encontramos como solventar este problema.&lt;br /&gt;&lt;br /&gt;Por otra parte, y muy relacionado con el tema de las excepciones, está la creación de registros de sucesos. Queremos estandarizar la forma de guardar "logs" en todas nuestras aplicaciones y nos hemos encontrado con dos posibles librerías candidatas, ambas de código abierto y que estudiaremos en el futuro:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://logging.apache.org/log4net/"&gt;log4net&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/entlib.asp"&gt;Microsoft Exception Management Application Block&lt;/a&gt; (parte de Enterprise Library)&lt;br /&gt;&lt;br /&gt;¿Cual ha sido vuestra experiencia con cualquiera de estas librerías?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-112730915731802762?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/112730915731802762/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=112730915731802762' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112730915731802762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112730915731802762'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/09/gestin-de-excepciones-en-windows-forms.html' title='Gestión de excepciones en Windows Forms y Logs'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-112538152914105928</id><published>2005-08-30T07:58:00.000+02:00</published><updated>2005-08-30T08:14:53.736+02:00</updated><title type='text'>No consigo guardar una imagen!</title><content type='html'>Esta mañana programando me he encontrado con un bug en .NET: Cuando abres una imagen en un &lt;strong&gt;PictureBox&lt;/strong&gt; o usas la función &lt;strong&gt;Image.FromFile()&lt;/strong&gt;, el archivo de la imagen queda bloqueda y no es posible escribir sobre la misma. Por suerte, Microsoft ofrece una &lt;a href="http://support.microsoft.com/default.aspx/kb/311754/EN-US/?"&gt;solución&lt;/a&gt;. Básicamente consiste en cargar la imagen desde un Stream:&lt;br /&gt;&lt;br /&gt;// Make sure that you have added the System.IO namespace.&lt;br /&gt;using System.IO;&lt;br /&gt;&lt;br /&gt;// Specify a valid picture file path on your computer.&lt;br /&gt;FileStream fs;&lt;br /&gt;fs = new FileStream("C:\\WINNT\\Web\\Wallpaper\\Fly Away.jpg", FileMode.Open, FileAccess.Read);&lt;br /&gt;pictureBox1.Image = System.Drawing.Image.FromStream(fs);&lt;br /&gt;fs.Close();&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-112538152914105928?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/112538152914105928/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=112538152914105928' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112538152914105928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112538152914105928'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/08/no-consigo-guardar-una-imagen.html' title='No consigo guardar una imagen!'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-112518786219974460</id><published>2005-08-28T02:10:00.000+02:00</published><updated>2005-08-28T02:11:02.206+02:00</updated><title type='text'>Valor null en FormsAuthentication.Encrypt</title><content type='html'>En ASP.NET es posible autenticar a un usuario usando FormsAuthentication creando un FormsAuthenticationTicket y luego añadiendo una cookie con ese ticket, tal y como se muestra en el siguiente código:&lt;br /&gt;&lt;br /&gt;FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,&lt;br /&gt;     userName,&lt;br /&gt;     DateTime.Now,&lt;br /&gt;     DateTime.Now.AddMinutes(30),&lt;br /&gt;     isPersistent,&lt;br /&gt;     userData,&lt;br /&gt;     FormsAuthentication.FormsCookiePath);   &lt;br /&gt;   &lt;br /&gt;   // Encrypt the ticket.&lt;br /&gt;   string encryptedTicket = FormsAuthentication.Encrypt(ticket);&lt;br /&gt;&lt;br /&gt;   // Create the cookie.&lt;br /&gt;   Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Redirect back to original URL.   Response.Redirect(FormsAuthentication.GetRedirectUrl(userName, isPersistent));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pues ese código a mi no me funcionaba. La variable encryptedTicket que me devolvía la función FormsAuthentication.Encrypt(ticket) era siempre nulo a pesar de pasarle unos valores que aparentemente eran correcto.&lt;br /&gt;&lt;br /&gt;El problema estaba en la variable userData utilizada en el constructor del ticket.. Yo no la estaba utilizando para nada, así que le daba el valor nulo y eso es lo que provocaba que, aunque el ticket se creara bien, su encriptación no. Basta con darle al parámetro "userData" el valor String.Empty o "".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-112518786219974460?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/112518786219974460/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=112518786219974460' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112518786219974460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112518786219974460'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/08/valor-null-en-formsauthenticationencry.html' title='Valor null en FormsAuthentication.Encrypt'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-112507176385243462</id><published>2005-08-26T17:56:00.000+02:00</published><updated>2005-08-26T17:56:03.873+02:00</updated><title type='text'>Nombre de una página en una web</title><content type='html'>Uno de los factores más importantes para una web es el posicionamiento que tiene en los buscadores, y en especial en &lt;a href="http://www.google.com"&gt;Google&lt;/a&gt;, el buscador por excelencia.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://eltelendro.blogspot.com/2005/08/posicionamiento-guion-medio-o-guion.html"&gt;Leo en el telendro&lt;/a&gt; que es mejor separar los nombres de las páginas web por guiones medios en vez de guiones bajos ya que en el primer caso reconoce cada palabra por separado y en segundo considera la palabra unida. &lt;br /&gt;&lt;br /&gt;Veamos un ejemplo, para que quede más claro:&lt;br /&gt;"calefacción-y-aire-acondicionado", proporciona tres palabras claves potenciales: "calefacción", "aire" y "acondicionado", mientras que "calefaccion_y_aire_acondicionado", proporciona la palabra clave "calefaccionyaireacondicionado" que no tiene mucho sentido.&lt;br /&gt;&lt;br /&gt;Esta regla la tendremos en cuenta en la nueva versión de &lt;a href="http://www.todoexpertos.com"&gt;Todoexpertos.com&lt;/a&gt; que ahora separa los nombres de las categorías por el guión bajo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-112507176385243462?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/112507176385243462/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=112507176385243462' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112507176385243462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112507176385243462'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/08/nombre-de-una-pgina-en-una-web.html' title='Nombre de una página en una web'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-112504410768390643</id><published>2005-08-26T10:15:00.000+02:00</published><updated>2005-08-26T10:15:07.703+02:00</updated><title type='text'>Configurar CruiseControl.NET con VSS, NAnt y NUnit</title><content type='html'>Una vez dedicido que queríamos utilizar la integración contínua y que la herramienta apropiada era &lt;a href="http://ccnet.thoughtworks.com/"&gt;CruiseControl.net&lt;/a&gt; (CCnet para los amigos), el siguiente problema era configurarlo desde 0.&lt;br /&gt;&lt;br /&gt;Por suerte, encontré esta página en la que te guían paso a paso y desde 0:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://joefield.mysite4now.com/blog/articles/146.aspx"&gt;CruiseControl.NET from Scratch - Version 0.9&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Aunque me ha costado un par de días para ajustarlo y tenerlo funcionado justo como queríamos (con pruebas, métricas, etc...). no sé como hemos podido trabajar sin la integración continua y el desarrollo orientado a pruebas. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-112504410768390643?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/112504410768390643/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=112504410768390643' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112504410768390643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112504410768390643'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/08/configurar-cruisecontrolnet-con-vss.html' title='Configurar CruiseControl.NET con VSS, NAnt y NUnit'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-112503771182919561</id><published>2005-08-26T08:28:00.000+02:00</published><updated>2005-08-26T08:29:13.906+02:00</updated><title type='text'>NUnit y la base de datos.</title><content type='html'>Estamos realizando pruebas automatizadas de uno de nuestros proyectos con &lt;a href="http://www.nunit.org/"&gt;NUnit&lt;/a&gt; pero nos hemos encontrado con el problema de que cuando se ejecutaban los tests y fallaban por algún motivo, los registros de la base de datos no se eliminaban correctamente y la base de datos perdía consistencia.&lt;br /&gt;&lt;br /&gt;La solución más simple es tener dos bases de datos, pero eso tiene el problema de mantener las dos BBDD sincronizadas. &lt;a href="http://weblogs.asp.net/mschwarz/archive/2004/08/26/220735.aspx"&gt;Este script&lt;/a&gt; nos facilita mucho esta labor sin tener que recurrir a herramientas comerciales.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-112503771182919561?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/112503771182919561/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=112503771182919561' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112503771182919561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/112503771182919561'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/08/nunit-y-la-base-de-datos.html' title='NUnit y la base de datos.'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-110736455516641020</id><published>2005-02-02T18:15:00.000+01:00</published><updated>2005-02-02T18:15:55.166+01:00</updated><title type='text'>Cómo depurar un Servicio de Windows</title><content type='html'>Una de las cosas más difíciles de depurar son los servicios de windows. En la siguiente página se muestran los pasos necesarios para realizarlo: &lt;br&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/library/en-us/vbcon/html/vbtskdebuggingserviceapplications.asp?frame=true"&gt;Debugging Windows Service Applications (Visual Basic and Visual C# Concepts)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-110736455516641020?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/110736455516641020/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=110736455516641020' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/110736455516641020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/110736455516641020'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/02/cmo-depurar-un-servicio-de-windows.html' title='Cómo depurar un Servicio de Windows'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-110551908214531980</id><published>2005-01-12T10:38:00.000+01:00</published><updated>2005-01-12T09:40:17.510+01:00</updated><title type='text'>Crear Add-Ins para Visual Studio</title><content type='html'>Si trabajas continuamente en tareas de programación encontrarás que hay tareas muy repetitivas que te gustaría automatizar. En Visual Studio existe la posibilidad de crear Macros o bien Complementos (Add-ins) de Visual Studio.&lt;br /&gt;&lt;br /&gt;Crear un Add-In en C# no es nada simple por varios motivos:&lt;br /&gt;1.- Aunque el asistente crea la estructura básica del código del Add-In, esta estructura sigue siendo muy confusa y no sabes muy bien que debes tocar y como.&lt;br /&gt;2.-  La ayuda de VS para C# es claramente deficiente.&lt;br /&gt;3.- Parece que la API del DTE usada en los complementos está especialmente diseñada para Visual Basic y no para C#. Por ello, existen algunos métodos utilizan parámetros opcionales que C# no soporta directamente y hay que crear mucho más código del necesario en VB.&lt;br /&gt;&lt;br /&gt;Por suerte, he encontrado un artículo que te muestra muy bien cómo desarrollar los Add-ins de Visual Studio en C#:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/02/02/VSIDE/default.aspx"&gt;Visual Studio .NET: Custom Add-Ins Help You Maximize the Productivity of Visual Studio .NET -- MSDN Magazine, February 2002&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-110551908214531980?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/110551908214531980/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=110551908214531980' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/110551908214531980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/110551908214531980'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/01/crear-add-ins-para-visual-studio.html' title='Crear Add-Ins para Visual Studio'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-110545493621216923</id><published>2005-01-11T15:48:00.000+01:00</published><updated>2005-01-11T15:48:56.213+01:00</updated><title type='text'>Accesibilidad y estándares en los sitios web</title><content type='html'>Cada vez cobra mayor importancia la accesibilidad y los estándares en los sitios web, sobre todos si son webs de la administración pública. En este artículo se analizanas web de la administración pública según los criterios establecidos por la W3C&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.emergia.net/investigacion/experiencia/administracion/problemas.htm"&gt;Los principales sitios web de la Administraci&amp;oacute;n Publica española no son accesibles&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-110545493621216923?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/110545493621216923/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=110545493621216923' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/110545493621216923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/110545493621216923'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2005/01/accesibilidad-y-estndares-en-los.html' title='Accesibilidad y estándares en los sitios web'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-110319927853187699</id><published>2004-12-16T13:14:00.000+01:00</published><updated>2004-12-16T13:14:38.530+01:00</updated><title type='text'>El desarrollo ágil</title><content type='html'>Tengo que investigar esta página sobre desarrollo ágil para ver qué métodología comenzamos a usar:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.agile-spain.com/"&gt;http://www.agile-spain.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-110319927853187699?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/110319927853187699/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=110319927853187699' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/110319927853187699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/110319927853187699'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2004/12/el-desarrollo-gil.html' title='El desarrollo ágil'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413869.post-110295358817500757</id><published>2004-12-13T16:59:00.000+01:00</published><updated>2004-12-13T16:59:48.176+01:00</updated><title type='text'>Página de inicio de Mozilla Firefox</title><content type='html'>Google ha hecho un guiño al navegador Firefox al crear una página específica para él.&lt;br /&gt;&lt;a href="http://www.google.es/firefox?client=firefox-a&amp;amp;rls=org.mozilla:en-US:official"&gt;P�gina de inicio de Mozilla Firefox&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413869-110295358817500757?l=netdevelop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netdevelop.blogspot.com/feeds/110295358817500757/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413869&amp;postID=110295358817500757' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/110295358817500757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413869/posts/default/110295358817500757'/><link rel='alternate' type='text/html' href='http://netdevelop.blogspot.com/2004/12/pgina-de-inicio-de-mozilla-firefox.html' title='Página de inicio de Mozilla Firefox'/><author><name>Richard</name><uri>http://www.blogger.com/profile/10114488137802557516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
