<?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-1825105177117746879</id><updated>2012-02-17T01:34:56.421-03:00</updated><category term='ASP.NET MVC .NET 2.0'/><category term='colas queue'/><title type='text'>El Blog de Alejandro Vidal Quiroga</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://alejandrovidalquiroga.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1825105177117746879/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://alejandrovidalquiroga.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alejandro Vidal Quiroga</name><uri>http://www.blogger.com/profile/02005143501734129436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBfyJ4vyC7g/SJ_Slmd5-BI/AAAAAAAAAAU/TUt4AZdRsUw/s1600-R/Alejandro_thumb.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1825105177117746879.post-4218850672827838540</id><published>2010-08-25T03:12:00.002-03:00</published><updated>2010-08-25T03:29:45.041-03:00</updated><title type='text'>Utilización de Tópicos (Topics)</title><content type='html'>¿Que es un &lt;span style="font-weight: bold;"&gt;Tópico&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;Topic&lt;/span&gt;)?&lt;br /&gt;&lt;br /&gt;Un Tópico es una herramienta de publicación de mensajes a subscriptores, esto quiere decir que cada vez que yo ponga un mensaje en un Tópico todos los subscriptores lo van a recibir.&lt;br /&gt;&lt;br /&gt;En general se lo relaciona directamente con las Colas por ser un caso especial de las mismas, o viceversa (para evitar discusiones filosóficas).&lt;br /&gt;&lt;br /&gt;Los Tópicos resuelven dos grandes problemas de las arquitectura:&lt;br /&gt;&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;Publicación&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;Replicación&lt;br /&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;Desacoplamiento&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Publicación&lt;/span&gt;&lt;br /&gt;En ambientes distribuidos muchas veces es necesario transmitir comandos a todos los nodos. Por ejemplo comandos para reinicializar caches y estadísticas, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Replicación&lt;/span&gt;&lt;br /&gt;Cuando uno necesita tener varios ambientes replicados. Esto quiere decir que pongo datos en el Tópico que necesito si inserte en varios ambientes. Es muy útil en entornos heterogéneos donde puedo tener una base de datos Oracle y otra DB2.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Desacoplamiento&lt;/span&gt;&lt;br /&gt;Al igual que las Colas los Tópicos son un intermediario por definición, el desacoplamiento es totalmente natural y se pueden agregar y sacar suscriptores en cualquier momento.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1825105177117746879-4218850672827838540?l=alejandrovidalquiroga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alejandrovidalquiroga.blogspot.com/feeds/4218850672827838540/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alejandrovidalquiroga.blogspot.com/2010/08/utilizacion-de-topicos-topics.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1825105177117746879/posts/default/4218850672827838540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1825105177117746879/posts/default/4218850672827838540'/><link rel='alternate' type='text/html' href='http://alejandrovidalquiroga.blogspot.com/2010/08/utilizacion-de-topicos-topics.html' title='Utilización de Tópicos (Topics)'/><author><name>Alejandro Vidal Quiroga</name><uri>http://www.blogger.com/profile/02005143501734129436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBfyJ4vyC7g/SJ_Slmd5-BI/AAAAAAAAAAU/TUt4AZdRsUw/s1600-R/Alejandro_thumb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1825105177117746879.post-4702697374801520342</id><published>2010-08-16T22:27:00.008-03:00</published><updated>2010-08-23T22:20:16.026-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='colas queue'/><title type='text'>Utilización de Colas (Queue) (Uso de Colas)</title><content type='html'>¿Qué es una Cola (&lt;span style="FONT-WEIGHT: bold"&gt;Queue&lt;/span&gt;)?&lt;br /&gt;&lt;br /&gt;En la actualidad las colas son la herramienta por excelencia para cumplir con tres conceptos fundamentales de arquitectura:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Distribución de carga&lt;/li&gt;&lt;li&gt;Desacoplamiento&lt;/li&gt;&lt;li&gt;Transaccionabilidad y Tolerancia&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Distribución de carga&lt;/span&gt;&lt;br /&gt;Las Colas tienen tres características básicas que favorecen su participación en la distribución de carga:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Múltiples clientes simultáneos, varios clientes (Agentes) pueden estar esperando mensajes que se depositen la cola al mismo tiempo. Estos Agentes pueden estar en el mismo servidor o en distintos servidores.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Exclusividad de mensajes, un mensaje que es tomado (decolado) por uno de los Agentes es bloqueado para que no sea decolado por otro Agente.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Centralización de la distribución, al poner la cola en un servidor central es muy fácil su administración así como también agregar agentes o quitarlos.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Desacoplamiento&lt;/span&gt;&lt;br /&gt;Al ser la Cola un intermediario por definición, existe una separación entre el proveedor del mensaje y el consumidor del mismo. El único requisito es que se sepa manejar el mensaje.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Transaccionabilidad y Tolerancia&lt;/span&gt;&lt;br /&gt;Una de las características transaccionales de las colas es que si uno de los agentes fracasa en su ejecución el mensaje es devuelto a la cola para ser procesado por otro agente que tal vez tenga éxito.&lt;br /&gt;&lt;br /&gt;El rollback puede darse por dos razones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Voluntaria, el programador lo genera porque ha detectado que hay un error que puede ser reintentado, casos como IO (Sin espacio en disco, conexión caída, etc.).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Involuntaria, se cayo el servidor, problema de hardware, etc.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1825105177117746879-4702697374801520342?l=alejandrovidalquiroga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alejandrovidalquiroga.blogspot.com/feeds/4702697374801520342/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alejandrovidalquiroga.blogspot.com/2010/08/utilizacion-de-colas-y-topicos-queue.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1825105177117746879/posts/default/4702697374801520342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1825105177117746879/posts/default/4702697374801520342'/><link rel='alternate' type='text/html' href='http://alejandrovidalquiroga.blogspot.com/2010/08/utilizacion-de-colas-y-topicos-queue.html' title='Utilización de Colas (Queue) (Uso de Colas)'/><author><name>Alejandro Vidal Quiroga</name><uri>http://www.blogger.com/profile/02005143501734129436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBfyJ4vyC7g/SJ_Slmd5-BI/AAAAAAAAAAU/TUt4AZdRsUw/s1600-R/Alejandro_thumb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1825105177117746879.post-9095219806492660226</id><published>2009-05-03T03:50:00.008-03:00</published><updated>2009-05-03T06:08:02.766-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC .NET 2.0'/><title type='text'>Implementación de ASP.NET MVC para .NET 2.0</title><content type='html'>En uno de los trabajos freelance web que me ha tocado realizar uno de los requierimientos fue que corriera sobre ASP.NET 2.0, y por error yo realice todo el trabajo sobre ASP.NET MVC y sobre .NET Framework 3.5. Al darme cuenta del error trate de buscar una forma de hacer correr el codigo igualmente pero sin suerte.&lt;br /&gt;&lt;br /&gt;Mas alla de los cambios obios que hay que realizar al codigo por la version del CLR y el interpretador de aspx, no encontre ninguna implementacion que soportara el modelo de vistas y controladores tal como la hace ASP.NET MVC.&lt;br /&gt;&lt;br /&gt;Por esta razon he realizado la siguiente implementacion que por el momento soporta:&lt;br /&gt;&lt;br /&gt;Controllers&lt;br /&gt;Views&lt;br /&gt;Actions&lt;br /&gt;&lt;br /&gt;La base de todo esta en la configuracion del archivo web.config, ahi es donde todo empieza a funcionar, donde tenemos que imitar el funcionamiento de ASP.NET MVC.&lt;br /&gt;&lt;br /&gt;Web.Config:&lt;br /&gt;&lt;httphandlers&gt;&lt;httphandlers&gt;&lt;add verb="*" path="/Encuestas/*" type="SistemaDeEncuestas.MainController"&gt;&lt;add verb="*" path="/Encuestas/*/*" type="SistemaDeEncuestas.MainController"&gt;&lt;remove verb="*" path="/Encuestas/Views/*"&gt;&lt;remove verb="*" path="/Encuestas/Views/*/*"&gt;&lt;remove verb="*" path="/Encuestas/Content/*"&gt;&lt;add verb="*" path="/Encuestas/*" type="SistemaDeEncuestas.MainController"&gt;&lt;add verb="*" path="/Encuestas/*/*" type="SistemaDeEncuestas.MainController"&gt;&lt;remove verb="*" path="/Encuestas/Views/*"&gt;&lt;remove verb="*" path="/Encuestas/Views/*/*"&gt;&lt;remove verb="*" path="/Encuestas/Content/*"&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);font-family:verdana;font-size:78%;"  &gt;&amp;lt;httpHandlers&amp;gt; &amp;lt;add verb="*" path="/Encuestas/*" type="SistemaDeEncuestas.MainController"/&amp;gt;&lt;br /&gt;      &amp;lt;add verb="*" path="/Encuestas/*/*" type="SistemaDeEncuestas.MainController"/&amp;gt;&lt;br /&gt;      &amp;lt;remove verb="*" path="/Encuestas/Views/*"/&amp;gt; &amp;lt;remove verb="*" path="/Encuestas/Views/*/*"/&amp;gt;&lt;br /&gt;      &amp;lt;remove verb="*" path="/Encuestas/Content/*"/&amp;gt; &amp;lt;remove verb="*" path="/Encuestas/Content/*/*"/&amp;gt;&lt;br /&gt;      &amp;lt;/httpHandlers&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como bien saben ASP.NET MVC utiliza la url para hacer el mapeo contra los metodos que se encuentran dentro de nuestros controladores que tambien se mapean desde la url:&lt;br /&gt;&lt;br /&gt;    /MiAplicacion/&lt;controlador&gt;"Controller"/""&lt;metodo&gt;&lt;br /&gt;&lt;br /&gt;Dentro de ASP.NET MVC a todo metodo que se accede de esta manera se lo llama Action.&lt;br /&gt;&lt;br /&gt;Esta implementacion realiza todo este mapeo a traves de la clase MainController que uds pueden ver configurada como httpHanddler en el archivo Web.config.&lt;br /&gt;&lt;br /&gt;MainController:&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);font-size:78%;" &gt;&lt;span style="font-family:verdana;"&gt;namespace MiAplicacion&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    public class MainController : IHttpHandler, IRequiresSessionState&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        public void ProcessRequest(HttpContext context)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;br /&gt;      // Parseo de la URL&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;            string[] parts = context.Request.FilePath.Split('/');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if( parts.Length &lt;&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                return;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            string applicationName = parts[1];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            string actionName = parts[2];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            string methodName = "Index";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if (parts.Length &gt; 3)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                methodName = parts[3];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if (actionName == null)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                return;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            ViewPage.setContext( context, applicationName, actionName ); &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            // Instanciacion del Controller&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            string controllerName = this.GetType().Namespace+"."+actionName + "Controller";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            Type t = Type.GetType(controllerName);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            object controller = t.InvokeMember(controllerName, BindingFlags.CreateInstance, null, null, null);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            t.InvokeMember("setApplicationName", BindingFlags.InvokeMethod, null, controller, new object[] { applicationName });&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            t.InvokeMember("setActionName", BindingFlags.InvokeMethod, null, controller, new object[] { actionName });&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            t.InvokeMember("setMethodName", BindingFlags.InvokeMethod, null, controller, new object[] { methodName });&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            t.InvokeMember("setHttpContext", BindingFlags.InvokeMethod, null, controller, new object[] { context });&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            // Ejecucion del Action (Metodo dentro del controller)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            ActionResult actionResult = ((Controller)controller).ExecuteAction( methodName, context);&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            actionResult.ExecuteResult( new ControllerContext(context) );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        public bool IsReusable&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            get&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                return false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;Como pueden ver para poder lograr todo esto se hace uso exaustivo de reflexion y instrocpection que para quienes no estan familiarizados con los terminos son formas de manipular las clases.&lt;br /&gt;&lt;br /&gt;Para dar soporte a los elementos que se usan en ASP.NET MVC tuve que realizar la implementacion completa de las siguientes clases:&lt;br /&gt;&lt;/span&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;ActionResult&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Controller&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;ControllerContext&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Html&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Url&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;ViewActionResult&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;ViewPage&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;La clase ViewPage posiblemente es la mas oculta pero definitivamente la mas util en la presentación ya que es la provee a la pagina aspx de los elementos:&lt;br /&gt;&lt;/span&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;ViewData&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Html&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Url&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;ViewPage:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);font-family:verdana;font-size:78%;"  &gt;public class ViewPage : System.Web.UI.Page&lt;br /&gt;{&lt;br /&gt;public Hashtable ViewData;&lt;br /&gt;public static Url Url;&lt;br /&gt;public static Html Html;&lt;br /&gt;private static HttpContext context;&lt;br /&gt;&lt;br /&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;  if (Context.Items["ViewData"] != null)&lt;br /&gt;  {&lt;br /&gt;      ViewData = (Hashtable)Context.Items["ViewData"];&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public ViewPage()&lt;br /&gt;{&lt;br /&gt;  ViewData = new Hashtable();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void setContext( HttpContext httpContext, string applicationName, string actionName )&lt;br /&gt;{&lt;br /&gt;  context = httpContext;&lt;br /&gt;  Url = new Url( applicationName, actionName);&lt;br /&gt;  Html = new Html(context);&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;Como pueden ver en el metodo Page_Load se asigan el objeto ViewData al item del contexto tambien llamado ViewData. Este item del contexto se asigna en la clase abstracta Controller, la cual es heredada por todos los controladores de nuestra aplicacion, cuando se ejecuta la llamada al metodo setHttpContext por reflexion en la clase MainContext en la linea 37.&lt;br /&gt;&lt;br /&gt;Controller:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);font-family:verdana;font-size:78%;"  &gt;public abstract class Controller&lt;br /&gt;{&lt;br /&gt;public string applicationName;&lt;br /&gt;public string actionName;&lt;br /&gt;public string methodName;&lt;br /&gt;public HttpContext httpContext;&lt;br /&gt;public Hashtable ViewData;&lt;br /&gt;public HttpSessionState Session { get { return httpContext.Session; } }&lt;br /&gt;public HttpRequest Request { get { return httpContext.Request; } }&lt;br /&gt;&lt;br /&gt;public Controller()&lt;br /&gt;{&lt;br /&gt;  ViewData = new Hashtable();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setHttpContext(HttpContext httpContext)&lt;br /&gt;{&lt;br /&gt;  this.httpContext = httpContext;&lt;br /&gt;  this.httpContext.Items["ViewData"] = ViewData;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setMethodName(string methodName)&lt;br /&gt;{&lt;br /&gt;  this.methodName = methodName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setApplicationName(string s)&lt;br /&gt;{&lt;br /&gt;  this.applicationName = s;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setActionName(string s)&lt;br /&gt;{&lt;br /&gt;  this.actionName = s;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public ActionResult View( string view )&lt;br /&gt;{&lt;br /&gt;  if (ViewData["error"] != null)&lt;br /&gt;  {&lt;br /&gt;      httpContext.Items["error"] = ViewData["error"];&lt;br /&gt;  }&lt;br /&gt;  ViewActionResult action = new ViewActionResult();&lt;br /&gt;  action.setUrl("/" + applicationName + "/Views/" + actionName + "/" + view + ".aspx");&lt;br /&gt;  return action;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public ActionResult View()&lt;br /&gt;{&lt;br /&gt;  return View( methodName );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public ActionResult RedirectToAction(string method )&lt;br /&gt;{&lt;br /&gt;  methodName = method;&lt;br /&gt;  return RedirectToAction(method, null);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public ActionResult RedirectToAction( string method, object[] args )&lt;br /&gt;{&lt;br /&gt;  methodName = method;&lt;br /&gt;  return ExecuteAction( method, args);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public ActionResult ExecuteAction(string method, object[] args)&lt;br /&gt;{&lt;br /&gt;  methodName = method;&lt;br /&gt;  Type t = this.GetType();&lt;br /&gt;&lt;br /&gt;  ParameterInfo[] methodParams = t.GetMethod(method).GetParameters();&lt;br /&gt;  int methodParamsCount = methodParams.Length;&lt;br /&gt;&lt;br /&gt;  string[] keys = null;&lt;br /&gt;  object[] values = null;&lt;br /&gt;&lt;br /&gt;  if (methodParamsCount &gt; 0)&lt;br /&gt;  {&lt;br /&gt;      keys = new string[methodParamsCount];&lt;br /&gt;      values = new string[methodParamsCount];&lt;br /&gt;&lt;br /&gt;      int i = 0;&lt;br /&gt;      foreach (ParameterInfo key in methodParams)&lt;br /&gt;      {&lt;br /&gt;          keys[i] = key.Name;&lt;br /&gt;          if (i &lt; methodname =" method;" t =" this.GetType();" values =" null;" keys =" null;" methodparams =" t.GetMethod(method).GetParameters();" methodparamscount =" methodParams.Length;"&gt; 0)&lt;br /&gt;  {&lt;br /&gt;      keys = new string[methodParamsCount];&lt;br /&gt;      values = new string[methodParamsCount];&lt;br /&gt;      int i = 0;&lt;br /&gt;      foreach (ParameterInfo key in methodParams)&lt;br /&gt;      {&lt;br /&gt;          keys[i] = key.Name;&lt;br /&gt;&lt;br /&gt;          if (context.Request.Form[key.Name] != null)&lt;br /&gt;          {&lt;br /&gt;              values[i] = context.Request.Form[key.Name];&lt;br /&gt;          }&lt;br /&gt;          else if (context.Request.QueryString[key.Name] != null)&lt;br /&gt;          {&lt;br /&gt;              values[i] = context.Request.QueryString[key.Name];&lt;br /&gt;          }&lt;br /&gt;          else&lt;br /&gt;          {&lt;br /&gt;              values[i] = null;&lt;br /&gt;          }&lt;br /&gt;          i++;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;  return (ActionResult)t.InvokeMember(method, BindingFlags.InvokeMethod, null, this, values, null, null, keys);&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 0);font-size:100%;" &gt;Como pueden ver en la clase Controller es donde se implementan los metodos:&lt;br /&gt;&lt;/span&gt;&lt;ul style="color: rgb(51, 0, 0);"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;View y View(viewName)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;RedirectToAction(method) y RedirectToAction(method, args) &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(51, 0, 0);font-size:100%;" &gt;y se definen los objetos:&lt;br /&gt;&lt;/span&gt;&lt;ul style="color: rgb(51, 0, 0);"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;ViewData&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Session&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Request&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(51, 0, 0);font-size:100%;" &gt;Estos elementos son usados dentro de nuestro controlador:&lt;br /&gt;&lt;br /&gt;SistemaController:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);font-family:verdana;font-size:78%;"  &gt;namespace SistemaDeEncuestas&lt;br /&gt;{&lt;br /&gt;public class SistemaController : Controller&lt;br /&gt;{&lt;br /&gt;  public ActionResult Index()&lt;br /&gt;  {&lt;br /&gt;      if (Session["LoggedIn"] == null || (bool)Session["LoggedIn"] != true)&lt;br /&gt;      {&lt;br /&gt;          ViewData["error"] = "Primero de ingresar el sistema con sus credenciales";&lt;br /&gt;          return View("Login");&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;          return View("Panel");&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 0);font-size:100%;" &gt;Bueno, por ultimo les dejo algunos tips para downgrade:&lt;br /&gt;&lt;/span&gt;&lt;ul style="color: rgb(51, 51, 0);"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;En los aspx se debe cambiar la definicion &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;CodeBehind &lt;/span&gt;por &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;CodeFile&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;No se pueden usar los elementos ASP.NET MVC como ViewData en los master page files.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Todo lugar donde alla usado &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;new { key = value} &lt;/span&gt;debe reemplazarce por &lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;new object{key = value}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Para evitar cualquier inconveniente con los tipos de los datos yo use todos los parametros de los actions como &lt;span style="font-weight: bold;"&gt;strings &lt;/span&gt;y luego dentro los convierto al tipo correspondiente.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Tienen que reorganizar todos los &lt;span style="font-weight: bold;"&gt;usings &lt;/span&gt;porque ya no seran todos validos&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(51, 51, 0);font-size:100%;" &gt;Proximamente voy a subir todo el codigo a algun sitio para que lo puedan descargar y puedan seguir completando lo que falta para tener un soporte completo de todas las clases.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 0);font-size:100%;" &gt;El codigo completo se puede bajar desde aqui:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://aspnetmvc20.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=26921"&gt;http://aspnetmvc20.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=26921&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/metodo&gt;&lt;/controlador&gt;&lt;/remove&gt;&lt;/remove&gt;&lt;/remove&gt;&lt;/add&gt;&lt;/add&gt;&lt;/remove&gt;&lt;/remove&gt;&lt;/remove&gt;&lt;/add&gt;&lt;/add&gt;&lt;/httphandlers&gt;&lt;/httphandlers&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1825105177117746879-9095219806492660226?l=alejandrovidalquiroga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alejandrovidalquiroga.blogspot.com/feeds/9095219806492660226/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alejandrovidalquiroga.blogspot.com/2009/05/implementacion-de-aspnet-mvc-para-net.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1825105177117746879/posts/default/9095219806492660226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1825105177117746879/posts/default/9095219806492660226'/><link rel='alternate' type='text/html' href='http://alejandrovidalquiroga.blogspot.com/2009/05/implementacion-de-aspnet-mvc-para-net.html' title='Implementación de ASP.NET MVC para .NET 2.0'/><author><name>Alejandro Vidal Quiroga</name><uri>http://www.blogger.com/profile/02005143501734129436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBfyJ4vyC7g/SJ_Slmd5-BI/AAAAAAAAAAU/TUt4AZdRsUw/s1600-R/Alejandro_thumb.jpg'/></author><thr:total>0</thr:total></entry></feed>
