Monetizar nuestras Apps Windows Phone 8 con Admob

Hola que tal? esta vez vamos a hablar de algo que nos interesa a la gran mayoría, que es ganar dinero con nuestras aplicaciones. En un inicio, personalmente era un poco reacio a agregar publicidad en las apps, las hacía por “amor al arte”, pero ya saben, todos queremos una casa de oro y un auto cohete…

Ahora bien, Admob, por si no lo sabías, es un sistema de google, que nos permite rentabilizar y promocionar nuestras aplicaciones móviles con anuncios, los pasos para registrarse son bastante sencillos, puedes verlos acá:http://www.google.es/ads/admob/

A modo de historia, había estado probando en versiones anteriores a este SDK y funcionaba en modo debug, pero al momento de hacer realese, google dejaba de enviar la publicidad, con un código de error que indicaba que no existía publicidad disponible, el clásico error "NoFill" que puedes encontrar en los foros. Felizmente, esto ya no sucede, por lo que podemos seguir adelante Sonrisa

Entonces, lo primero, bajar el SDK para Windows Phone desde acá (Versión 6.5.11):
https://developers.google.com/mobile-ads-sdk/download#downloadwp

Una vez descargado vas a ver que existe un proyecto de prueba y una carpeta lib, vamos a abrir el proyecto de prueba, el que lamentablemente, no es out-the-box, es decir, no te va a funcionar a la primera, ya que la referencia al ensamblado GoogleAds no está bien hecha:

image

Así que vamos agregamos la referencia correctamente seleccionando GoogleAds de la carpeta Lib

image

y listo, ya tenemos la referencia, ahora si revisamos el código XAML del MainPage.xaml, veremos lo siguiente:

<GoogleAds:AdView AdUnitID="MY_AD_UNIT_ID"
                          Format="Banner"
                          ReceivedAd="OnAdReceived"
                          FailedToReceiveAd="OnFailedToReceiveAd"
                          VerticalAlignment="Bottom" />

Puedes notar que hay dos handlers que son el receiveAd que ocurre cuando se recibió desde google la publicidad y el FailedToReceivedAd, que ocurre cuando existe algún error, es bueno manejarlos para saber, que pasa cuando no llega algo y cual es el mensaje de error.

Ahora debemos agregar nuestro AD_UNIT_ID para poder obtener la publicidad, este número lo obtienes una vez registrado en admob y agregando una app para Windows Phone 8 , para esto vas al menú Monetizar, y luego [+ Monetizar aplicación nueva]

image

Luego agregamos el nombre de la aplicación y seleccionamos la plataforma manualmente

image

Luego seleccionar si queremos entre Banner e intersticial y los datos, en mi caso, seleccioné banner:

image

Es importante que agregues un nombre significativo al nombre del bloque de anuncios, así le puedes hacer seguimiento y análisis a tu banner, y recuerda que puedes tener varios banners dentro de la misma app.

Presionamos Guardar y ahora se nos presenta la pantalla en donde nos entrega e AD_UNIT_ID

image

Luego agrego este ID al código XAML;

 

<GoogleAds:AdView AdUnitID="ca-app-pub-9224915314665038/4125682904"

                          Format="Banner"

                          ReceivedAd="OnAdReceived"

                          FailedToReceiveAd="OnFailedToReceiveAd"

                          VerticalAlignment="Bottom" />

y probamos:

image

Como puedes ver, la publicidad se ve sin problemas, ahora bien , desde la creación de Anuncio hasta que sea utilizable pueden pasar unos minutos. (al menos esa es mi experiencia)

Espero que te sirva! nos vemos en otro post

@chalalo

Utilizar REDIS como proveedor de estado de sesión (y balanceo)

Hola, en este artículo vamos a ver como almacenar el estado de sesión de ASP.NET en REDIS, pudiendo servir para escalamiento horizontal de nuestra solución, al contrario de InProc que almacena los datos de la sesión en memoria del mismo servidor web.

Redis es un motor de base de datos en memoria, basado en el almacenamiento en tablas de hashes (clave/valor) pero que opcionalmente puede ser usada como una base de datos durable o persistente. Está escrito en ANSI C por Salvatore Sanfilippo quien es patrocinado por VMware.1 2 y está liberado bajo licencia BSD por lo que es considerado software de código abierto.

REDIS se comporta bastante bien  como almacén de sesiones, de hecho puedes ver una buena presentación sobre esto

Si ahora estas convencido, vamos a hacer el primer paso, que es descargar REDIS para Windows de la siguiente URL:

https://github.com/rgl/redis/downloads

Siguiente, siguientes… y listo, luego en c:

image

Luego verás REDIS instalado en c:Program FilesRedis

image

Puedes cambiar la configuración dentro de la carpeta conf en el archivo redis.conf, como puerto, contraseñas y mucho más.

Ahora debes correr el servicio con redis-server.exe

image

Luego vamos a utilizar el proyecto que está en la siguiente URL http://chadmeyercodez.wordpress.com/2012/07/06/redis-session-state-provider-for-asp-net/

En donde se dieron el trabajo de programar el proveedor de sesión y tambien de roles y membership, aunque nosotros para este ejemplo solo veremos el tema de la sesión. Puedes descargar el proyecto con todos los proveedores desde acá:

https://dl.dropboxusercontent.com/u/1303802/AspNetRedisProviders-master.zip

Nota: este proyecto no me pertenece, aunque es público.
Esta es la estructura del proyecto, en mi caso voy a extraer lo que necesito, para efectos de simplificar la solución:

image

Pd: esta solución utiliza BookSleeve como cliente de REDIS, si quieres puedes instalarlo desde Nuget http://www.nuget.org/packages/BookSleeve/

PM> Install-Package BookSleeve

Y bueno, ahora nuestro proyecto, voy a crear uno desde cero e ir incluyendo lo que necesitamos, mi proyecto va a ser mega simple , la gráfica es la siguiente:

image

La funcionalidad es mínima, lo que nos interesa es que funcione bien el almacenamiento de estado de sesión y además el compartir las sesiones en una granja de servidores, simuladas por dos sitios web en mi misma máquina, los cuales no comparten app pool, pero deben compartir sesiones, de manera de que si un sitio cae, siga funcionando sin problemas las sesiones en el otro sitio, básicamente es lo siguiente:

image

Veamos el código asociado a la pantalla, es casi cero:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

namespace RedisDemo

{

    public partial class _Default : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            if (!Page.IsPostBack)

            {

                lb_session.Text =Convert.ToString(Session["test"]);

            }

        }

 

        protected void Button1_Click(object sender, EventArgs e)

        {

            Session["test"] = TxSession.Text;

        }

    }

}

Como ves, lo único que hace es setear la sesión y cuando se carga por primera vez la página, o si quieres,  cuando no hace postback, obtiene el valor de la sesión.

Se debe agregar la siguiente línea al web.config dentro de system.web para indicar el nuevo proveedor de estado de sessión

<sessionState mode="Custom" customProvider="RedisSessionProvider">

<providers>

<add name="RedisSessionProvider"
      type
="RedisProviders.RedisSessionStateStoreProvider, RedisProviders"
/>

</providers>

</sessionState>

Para este demo, mi configuración del IIS tengo lo siguiente:

image

Dos sitios web con la misma aplicación, Sitio 1 en el puerto 8080 y Sitio 2 en el puerto 8081:

image

Ahora seteo en Sitio 1 la sesión con el valor “Probando” y …

image

Al refrescar sitio 2 ya tiene el valor de la sesión Sonrisa, excelente!! Risa  al parar el sitio1 image

Volvemos a subir el sitio 1 y la sesión todavía existe Sonrisa, no se pierde:

image

Muy cool!, te dejo el código para que puedas probarlo:

DESCARGAR

Invitación a Charla : Microsoft ASP.NET SignalR: La Web en Tiempo Real Simplificada

SignalR Logo

Hola!, los quería invitar a este webcast que voy en donde vamos a hablar desde la teoría hasta la práctica sobre signalR de manera que puedas fácilmente incorporar esta biblioteca que nos permite crear Web con comportamiento en tiempo real con un esfuerzo mínimo! SignalR se preocupará de las capacidades del browser para lograr la comunicación!!, bueno hay varias características muy cool que podemos revisar.

Cuando?

Inicio: martes, 25 de febrero de 2014.
Zona horaria: (GMT-05:00) Bogotá – 13:00 horas /Chile 15:00 horas
Duración: 1 hora(s)

Regístrate acá:

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032577901&Culture=es-AR&community=0

Que NO hacer con ASP.NET

Estas son buenas prácticas que están extraídas de http://www.asp.net/aspnet/overview/web-development-best-practices/what-not-to-do-in-aspnet,-and-what-to-do-instead y encontré interesante traducirlas. Quizás alguien podría decir “lo primero que debes hacer con ASP.NET es no programar con WebForms”, y puede tener razón a esta altura del partido, pero si ya tienes apps con WebForms y te es imposible migrarlas, (por esfuerzo, tiempo, etc), entonces sería bueno que hicieras un checklist de lo siguiente:

Control Adapters

Recomendación: Deja de utilizar control adapters para el render adaptativo y comienza a usar CSS media queries y código estándar HTML. Los control adapters aparecieron en NET 2.9 para hacer render para diferentes dispositivos y entornos. Ahora, este render adaptativo puede ser construido con CSS y HTML. Asi que, deja de usarlos Sonrisa

Para mayor información, revisa info de Media Queries y How To: Add Mobile Pages to Your ASP.NET Web Forms / MVC Application.

Estilos en los Controles

Recomendación: Ya no más!, no debemos setear los estilos en el markup del control, por el contrario, se deben asignar los estilos en sus correspondientes CSS.

Si bien los webcontrols contienen ciertas propiedades que pueden ser usadas para setear estilos “in-line” , por ejemplo , la propiedad Forecolor, que setea el color del texto de un control, podemos lograr este mismo efecto de manera mucho más efectiva a través de las hojas de estilo, las cuales permiten centralizar los valores de los estilos y evitamos el “desorden” de asignar todo in-line.

Control Callbacks

Recomendación: Dejar de utilizar los control callbacks, y en lugar utilizar Ajax, UpdatePanel (peligro!) métodos de acción MVC , Web API o SignalR.

En versiones anteriores de ASP.NET esta característica permitía actualizar parte de la pagina web sin actualizar la pagina completa. Ahora esto lo podemos realizar con AJAX, UpdatePanels, MVC, Web API,m SignalR. 

Browser Capability Detection

Recomendación: Dejar de usarlo, en su lugar utilizar la detección de características dinámicas.

En versiones anteriores de ASP.NEt, las características compatibles para cada navegador se almacenaban en un archivo XML. La detección de soporte de las funciones a través de una consulta estática no es el mejor enfoque. Ahora podemos detectar dinámicamente las funciones compatibles de un navegador utilizando librerías como Modernizr

Seguridad – Request Validation

Recomendación: Validar las entradas de usuario, y codificar la salida hacia los clientes.

El Request Validation es una característica de ASP.NET que inspecciona cada request  ya que detiene este request si encuentra una amenaza. Pero no descansar toda la seguridad de los datos que van hacia el servidor con esta característica. Se debe validar todas las entradas, y en casos más riesgosos en terminos de seguridad, utilizar expresiones regulares, ocupar librerías anti-xss, etc.

Formularios sin cookies de autenticación y sesiones

Recomendación: Requerir cookies.

El paso de información de autenticación en la cadena de consulta no es para nada seguro, por lo tanto , se requieren coockes cuando la aplicación requiera autenticación. Si nuestra cokkie almacna informaci{on sensible, hay que considerar requerir SSL para la cookie.

El siguiente ejemplo muestra como especicificar en un archivo Web.config que la autenticación de formularios reuqiere una cookie a traves de SSL

<authentication mode="Forms">
   <Formas loginUrl = "member_login.aspx"
     sin cookies = "UseCookies"
     requireSSL = "true"
     path = "/ MyApplication" />
 </ Authentication>

EnableViewStateMac

Recomendación: Nunca , pero re-nunca setearlo en False

Por defecto, EnableViewStateMac se establece en true. Incluso si nuestra aplicación no ocupa viewstate, nunca establezcamos este parámetro en false, ya que hará que nuestra app sea vulnerable a cross-site scripting. Si ya la has seteado en false, corre a cambiarlo Sonrisa

Medium Trust

Recomendación: No depender de la confianza media (o cualquier otro nivel de confianza) como límite de seguridad.

La confianza parcial no protege adecuadamente la solicitud y no debe ocuparse, debemos ocupar Full Trust, y aislar las aplicaciones no confiables en app pools distintos. También ejecutar cada app pool bajo una identidad única, para más información de esto podemos visitar ASP.NET Partial Trust does not guarantee application isolation.

<appSettings>

Recomendación: No desactivar la configuración de asegurar en elemento <appSetings>.

El elmento appSetting contiene muchos valores que son necesarios para las actualizaciones de seguridad, no hay que cambiar estos valores. Si tenemos que desactivar estos valores al implementar una actualización, debemos volver a dejarlos como estaban inmediatamente.Revisa más información acá ASP.NET appSettings Element.

UrlPathEncode

Recomendación: utilizar UrlEncode

El método UrlPathEncode se incluyó en el Net framework para resolver un prob lema muy especifico de compatibilidad con ciertos navegadores. Este método no codificia adecuadamente la URL y no protege el request de XSS, así que no lo ocupemos, en su lugar utilicemos UrlEncode.

Ejemplo:

string destinationURL = "http://www.contoso.com/default.aspx?user=test";
NextPage.NavigateUrl = "~/Finish?url=" + Server.UrlEncode(destinationURL);
 
PreSendRequestHeaders y PreSendRequestContext

Recomendación: No utilizar estos eventos con módulos gestionados.

Podemos utilizar los eventos PreSendRequestHeaders y PreSendRequestContext con módulos de IIS nativas, pero no los usemos con módulos gestionados que implementan IHttpModule. La configuración de estas propiedades puede causar problemas con las peticiones asíncronas.

Páginas con eventos asíncronos en WebForms

Recomendación: en los webforms, evitar escribir métodos void asíncronos para los eventos del ciclo de vida de la pagina, y en su lugar utilizar Page.RegisterAsyncTask.

El problema es que cuando no tenemos retorno para un método async no se puede determinar cuando el código asíncrono ha terminado.

Si estamos utilizando tareas asíncronas, setear el framework a 4.5 en el archivo Web.config. NET 4.5 introdujo un nuevo contexto de sincronización, este valor esta seteado por default en los nuevos proyectos, pero si estamos en un proyecto existente, obviamente no.

 <system.web>
     <httpRuntime TargetFramework="4.5" />
 </system.web>
Response.Redirect y Response.End

Recomendación: Tener en cuenta las diferencia en como es manejado el Thread una vez llamado el Responde.redirect(string).

Este método llamada al método Response.End, en un proceso sincrónico, el llamado a Resquest.Redirect hace que el subproceso actual se aborte de inmediato. Sin embargo, en un proceso síncrono el llamada a redirect no aborta el subproceso actual, por lo que la ejecución de código continua. En un proceso asíncrono, deberá devolver la tarea desde el método para detener la ejecución del código. En un proyecto MCV, no hay que llamar a un Response.Redirect, para eso tenemos RedirectResult.

EnableViewState y ViewStateMode

Recomendación: utilizar ViewStateMode en lugar de EnableViewState, que permite un control más detallado sobre el control del ViewState.

Cuando se establece EnableViewState en false en la directiva Page, el viewState queda deshabilitado para todas los controles dentro de la pagina y no se pueden activar individualmente. Si queremos habilitar el ViewState solo para ciertos controles , podemos configurar el viewStateMode para el control en el que necesitemos esta característica.

A nivel de página:
<% @ Page ViewStateMode = «Disabled».  .  .  %>

y en el control específico:
<asp:GridView ViewStateMode=»Enabled» runat=»server»>

con esto podemos reducir considerablemente el tamaño del viewstate. Sonrisa

Espero que te sirva!!

Saludos!!!
@chalalo

Instalación del Release de ASP.NET MVC 5.1, ASP.NET Web API 2.1 y ASP.NET Web Pages 3.1

Hola que tal, después de algún tiempo vuelvo a retomar el blog, esta vez con algo sencillo, pero muy útil, que es la instalación del release anunciado en el titulo de este post. Como puedes ver, y quizás sospechar, ya no hay tantos avisos para Web Forms, y es que esta tecnología esta siendo desplazada por otras más apegadas a estándares, de esto podemos conversar en otro post.

Para instalar el release de los 3 productos, podemos utilizar el gestor de paquetes Nuget, ya sea por consola o por el gestor de paquetes visual. Por consola debemos escribir lo siguiente:

  • Install-Package Microsoft.AspNet.Mvc -Version 5.1.0
  • Install-Package Microsoft.AspNet.WebApi -Version 5.1.0
  • Install-Package Microsoft.AspNet.WebPages -Version 3.1.0

O visualmente buscamos los paquetes dentro de Nuget

image

Ahora bien, para poder llegar a esto, debes tener instalado el Update1 de Visual Studio 2013 esto te tomará solo algunos, luego estas en condiciones de instalar los paquetes de actualización.

Es posible que tengas Visual Studio 2012 y quieras utilizar estos updates, entonces debes instalar antes ASP.NET and Web Tools 2013.1 for Visual Studio 2012.

Para ver una lista completa de las nuevas características del los updates te invito a que visitas las siguientes p{aginas:

De todos modos va en el futuro vamos a realizar muchas demos de las nuevas características para sacarle el mayor provecho.

Saludos1111

[2014] Iniciativas para el Blog para el 2014–Tutorial paso a paso de MVC, en detalle….

Hola que tal?, si bien he estado un poco “flojo” de escribir en el blog, tengo varias peticiones de los visitantes sobre que hacer, o que escribir o que grabar (screenCast). Lamento que no haya tenido el tiempo para escribir todo lo que quería, estoy metido en proyectos de desarrollo móvil con IOS (si, al mundo de la manzana), también estoy metido en proyectos de Android y Windows Phone. Sin embargo la pasión por ASP.NET sigue, y tomando en cuenta los comentarios es que voy a comenzar, entre otras cosas, un tutorial paso a paso de MVC 5, solicitado por varios desarrolladores de web forms, y otros que quieren conocer la tecnología.

Además seguir profundizando sobre OWIN & KATANA, ahora para el curso de ASP.NET MVC paso a paso, he visto varios temarios, algunos más completos que otros, me comprometo a todas las semanas levantar un video de manera que seamos constantes en el aprendizaje. Sonrisa

Bueno, nos vemos en los próximos post, si tienes sugerencias de lo que te gustaria ver de asp.net en este blog, me la haces llegar Sonrisa

Saludos!

ASP.NET Web API V2 .- IHttpActionResult

Una de las “curiosas” nuevas mejoras que tiene la versión 2 de ASP.NET Web API, este producto del que me declaro fan, por su facilidad de de exponer servicios y la facilidad de poder consumirlos con distintos clientes, es el retorno de los responses con una interfaz IHttpActionResult, lo que era bastante simple, Web API V2 simplifica bastante más el proceso. Ahora hay una nueva interfaz que se llama IHttpActionResult, que nos sirve para utilizarse como tipo de respuesta para las acciones del controlador, según corresponda. Para devolver una respuesta personalizada podemos utilizar los nuevos métodos expuestos a través de la API Controller

  • Ok
  • NotFound
  • Exception
  • Unauthorized
  • BadRequest
  • Conflict
  • Redirect
  • InvalidModelState

Por ejemplo en ASP.NET WEB API V1

public HttpResponseMessage Borrar(int id)
{
    var estado= BorrarCliente(id);
    if (estado)
    {
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
    else
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
}

y en ASP.NET WEB API  V2

public IHttpActionResult Delete(int id){ 
var estado=BorrarCliente(id);
if (estado) {
return Ok();
} else {
return NotFound();
    }
}

Hay bastantes escenarios en donde esta característica nos facilita la creación de código más limpio, ve más detalle en http://www.strathweb.com/2013/06/ihttpactionresult-new-way-of-creating-responses-in-asp-net-web-api-2/

Saludos!

Chalalo

[Video] Como conectar una app Android a un Webservice con ASP.NET

Hola!, como saben, el mundo no se compone de una sola tecnología, son variados los componentes que conforman una solución, y por lo mismo debemos dar soporte a ellos. En esta entrega, voy a abordar el como conectarse desde una app construida en Android a un Servicio Web construido con ASP.NET. Vamos a pasar desde el desarrollo hasta la publicación en IIS, de manera de poder consumirlo de una App Android, que también construiré paso a paso. La lógica es sencilla, el tema es abordar los pasos a seguir para que esto suceda.

Ve el video directamente en Youtube o  desde acá:

Conectarse desde Android a webservices

Saludos!!
Chalalo

Iniciando con OWIN, el inicio de algo grande, Parte II

Hola, ya vimos una pequeña introducción a Katana en el articulo pasado en donde vimos una introducción a su funcionamiento. Ahora es tiempo de dar mayor funcionalidad, mi idea es ir paso a paso agregando módulos para ir armando una pequeña app en donde podamos ver lo siguiente:

  • Productos con Stock
    • Producto 1
    • Producto 2
    • Producto 3
  • Producto Sin Stock
    • Producto 5
    • Producto 6

Para esto utilizaremos Katana claro está, Nancy para la generación de las etiquetas en el servidor y exponer los archivos estáticos HTML, Web API para los request AJAX y SignalR para el servicio de mensajería en tiempo real, como ven , utilizaremos algunas de las ultimas tecnologías disponibles para ASP.NET

Voy a continuar del ejemplo anterior, y mediante NuGet, voy a instalar el paquete de Nancy (nancy.owin)

image

Recuerda que  hay más paquetes de Nancy que te vas a encontrar en NuGet, pero para este caso, debes seleccionar Nancy.Owin. Ahora ya tenemos la referencia:

image

Paso siguiente es crear el módulo que nos servirá de ruteo en la generación de las etiquetas, puedes ver más sobre la definición de las Rutas de Nancy acá https://github.com/NancyFx/Nancy/wiki/Defining-routes

Nancy opera similar a MVC para manejar los request, por lo que te será familiar la construcción del módulo:

using System;

using System.Collections.Generic;

using System.Linq;

 

namespace DemoNancyOwin

{

    public class HomeModule : Nancy.NancyModule

    {

        public HomeModule()

        {

            Get["/"] = _ =>

            {

                var model = new

                {

                    titulo = "Listado de Productos",

                    autor = "Chalalo"

                };

                return View["home.html", model];

            };

            Get["/acerca"] = _ =>

            {

                var model = new

                {

                    autor = "Chalalo"

                };

                return View["acercade.html", model];

            };

 

        }

    }

}

Lo anterior declara que los request apuntados a la raíz de la aplicación(“/”) deben ser manejados por un delegado anónimo definido el la asociación de la expresión lambda. Esta funciona crea el modelo que solo tiene el titulo y el autor del articulo (jejejee), Nancy se encargará de hacer el render al view home, pasando el modelo a la vista.

Ahora construiremos la vista, para esto hago una carpeta que se llamará views y dentro agrego el archivo Home.html, que tendrá el siguiente aspecto (muy básico, sin css, todo me queda feo)

image

El código asociado a esto es:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">

<head>

    <meta charset="utf-8" />

    <title>@Model.titulo</title>

</head>

<body>

    <span>By @Model.autor</span>

    <section>

        <h2>Productos Con Stock</h2>

        <ul id="pcs">

            <li>Acá van los productos CS</li>

        </ul>

    </section>

 

    <section>

        <h2>Productos Sin Stock</h2>

        <ul id="pcs">

            <li>Acá van los productos SS</li>

        </ul>

    </section>

 

</body>

</html>

El acerca de solo tiene el siguiente código:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

    <title></title>

</head>

<body>

    <h1>Demo por @Model.autor </h1>

</body>

</html>

n esto hemos creado una funcionalidad básica, que todavía no funciona! esto es por que no hemos establecido el “pipeline Owin” y configurar el módulo de Nancy para participar en este pipeline. Si no has visto el post anterior, en esa oportunidad  instalamos los componentes de Katana Host y  Katana Server, en donde podemos utilizar Katana con IIS o “self-hosting” en donde el mismo proyecto es su propio host.

Volviendo al ejemplo, los componentes de Katana utilizan varias convenciones diferentes para cargar y ejecutar aplicaciones OWIN incluidas en el clase Start. Cuando un host de Katana carga una app OWIN, lo dirige a una clase de partida basada en las siguientes reglas:

  1. Si el archivo web.config contiene en la sección appSeting key=”owin:AppStartup”, el loader usa este valor de ajuste. El valor debe ser un tipo valido de NET.
  2. Si el ensamblado contiene el atributo [assembly: OwinStartup(typeof(MyStartup))], el loader usará el tipo especificado en el valor del atributo.
  3. Si se tiene ambas condiciones anteriores, el loader utilizará la opción 2.
  4. Si ninguna de estas condiciones se cumple, el loader va a escanear los ensamblados cargados en busca de un tipo denominado Startup, con un método que coincide con la firma Configure(IAppBuilder app)

Para este ejemplo vamos a ocupar la opción 2 (lo puedes ver cuando agrego el Startup.cs). De todas maneras, la documentación dice que si tenemos muchos tipos y clases diferentes, lo mejor es utilizar el AppSetting o el atributo del ensamblado para evitar una búsqueda innecesaria.

En nuestro proyecto( te recuerdo la estructura), tenemos una clase Statup, que es nuestro loader, la cual inicializa el pipeline Owin y en donde debemos agregar el componente de Nancy.

image

Así que modifico el ejemplo que veníamos usando, y de le indicamos a  la app que vamos a utilizar Nancy ( voy a comentar lo que vimos en el post Anterior)

using System;

using System.Threading.Tasks;

using Microsoft.Owin;

using Owin;

 

[assembly: OwinStartup(typeof(KatanaDemo2.Startup))]

 

namespace KatanaDemo2

{

    public class Startup

    {

        public void Configuration(IAppBuilder app)

        {

           /* app.Run(context =>

            {

                context.Response.ContentType = "text/html";

                return context.Response.WriteAsync("<h1> Hola Mundo!!</h1>");

            });*/

 

            app.UseNancy();

        }

    }

}

y ya estamos para la primera demo:

image

Como puedes ver, funciona. Ahora bien, el proyecto de ASP.NET por defecto agrega las referencias a System.Web, para asegurarme, eliminé todas las referencias y volví a ejecutar, acá la idea es la independencia!

image

Ya no esta System.Web en el proyecto y el concepto se mantiene, funcionando sin problemas la aplicación Sonrisa.

La estructura del proyecto es:

image

y a lo que queremos llegar en este serie de artículos es:

image

En este articulo vimos como agregar Nancy al Pipeline y a rutear de manera básica mediante este Framework, en el próximo articulo vamos a ver como asociar desde el cliente al server  mediante ASP.NET Web API.

Saludos!!
@chalalo