martes, 26 de febrero de 2013

IIS, ASP.NET : Cómo monitorizar aspectos del rendimiento de las aplicaciones en producción

En el artículo de hoy se explica con un par de pasos sencillos como obtener información puntualmente sobre qué está pasando en nuestro Site en producción en momentos concretos del día donde notamos que el rendimiento baja. Buscando el modo más sencillo de monitorizar que está pasando con nuestro site en

ASP.NET

en cuanto a rendimiento, sesiones activas, tiempos de respuesta, errores, etc… llegamos a la siguiente herramienta Monitor de Rendimiento de Windows que ahora veremos cómo configurarla para obtener la información que necesitamos.

En primer lugar vamos a Herramientas Administrativas /

Monitor de Rendimiento



IIS, ASP.NET : Cómo monitorizar aspectos del rendimiento de las aplicaciones en producción

El siguiente paso sería crear un conjunto de recopilador de datos personalizado para la traza que queremos definir. Pulsamos botón derecho en “Definido por el usuario” y en el menú contextual seleccionamos nuevo.

IIS, ASP.NET : Cómo monitorizar aspectos del rendimiento de las aplicaciones en producción

Al pulsar siguiente marcamos todas las casillas (el informe será más detallado e incluirá información de sistema)

IIS, ASP.NET : Cómo monitorizar aspectos del rendimiento de las aplicaciones en producción

Seleccionamos el contador que nos interesa para la traza. En este ejemplo queremos ver las sesiones activas del site, por tanto seleccionamos “Aplicaciones ASP.NET” de entre la lista de contadores, desplegamos y entre la sublista de contadores hemos de localizar el contador “Sesiones Activas”. Otro aspecto importante que hemos de fijarnos antes de pulsar Agregar es la lista de instancias del objeto seleccionado.

Si seleccionamos contadores relacionados con aplicaciones

IIS

en esta casilla nos hará seleccionar la instancia del site sobre el cual queremos recopilar información o en caso que especifiquemos “Total” recopilará informes globales sobre todos los sites que están alojados en

IIS

. Como veis en la imagen el ID de instancia que baraja el sistema no se identifica para nada con el nombre del site en sí. Para saber cuál de estas opciones se refiere a nuestro site hemos de conocer el ID de site que

IIS

ha asignado a cada site… para ello vamos a la consola de administración de IIS y pulsamos sobre la opción Sites del menú de árbol de la izquierda… en la lista de site que se muestra hay una columna ID y a partir de este número podremos identificar el site en esta lista… En el caso del ejemplo el ID de site que necesito es 4 por tanto selecciono la instancia _LM_W3SVC_4_ROOT de la lista y pulso “Agregar”.

IIS, ASP.NET : Cómo monitorizar aspectos del rendimiento de las aplicaciones en producción

Hay un par de pasos más en el asistente pero para nuestro propósito no sería necesario configurarlos, podemos pulsar Finalizar una vez añadidos los contadores que necesitemos y ya tenemos definido el conjunto recopilador de datos.

Vemos que se ha creado el conjunto de datos y en la sección informes se ha creado automáticamente un nodo con el mismo nombre que nuestro recopilador. Evidentemente no es bueno tener un conjunto siempre recopilando datos porque estaríamos penalizando el rendimiento del servidor y haciendo crecer archivos de log que si no vamos a usar es tontería tenerlos en activo. La idea es monitorizar en intervalos de tiempo que sabemos que se produce alguna punta de problemas o administrarlo manualmente de modo que activemos y nosotros mismos estemos atentos para pararlo cuando creamos que ya tenemos la información necesaria para tratar el problema. Si pulsamos botón derecho sobre el recopilador podemos activarlo manualmente pulsando “iniciar” o podemos incluso ir a “propiedades/programación” y configurarlo para que se active/desactive automáticamente en determinados momentos de la semana.

Vamos a iniciarlo manualmente pulsando botón derecho / iniciar. Veremos que se ha generado un registro dentro de informes/nombre_recopilador con nombre del equipo + fecha día. Mientras el contador esté iniciado no podremos acceder a los datos del informe, nos saldrá una pantalla como la de la imagen.

IIS, ASP.NET : Cómo monitorizar aspectos del rendimiento de las aplicaciones en producción

Una vez paramos el recopilador pulsando botón derecho / “Detener” ya podremos acceder al informe y su pulsamos “propiedades” sobre el informe podremos acceder a información más detallada y jugar con cómo se muestran los datos.

IIS, ASP.NET : Cómo monitorizar aspectos del rendimiento de las aplicaciones en producción

La herramienta Monitor de rendimiento en la versión que hemos visto en las capturas está disponible en Windows 2008 Server o Windows 7 (Vista no lo tengo claro). En caso de disponer de un Windows 2003 Server o otra versión de anterior a Windows 7 el monitor de rendimiento existe y nos permite llegar a recopilar la misma información aunque cambia un poco los pasos para configurar el recopilador y consultar informes.

Hasta aquí el artículo de hoy, como siempre recordaros que podéis seguir

areaTIC

y lanzarnos vuestras dudas/aportaciones en las redes sociales o RSS!!


martes, 19 de febrero de 2013

Scrum Norris vs SQL Server Norris... Fight!!

Después de 60 artículos en el blog llega el momento de relajarnos un poco y de ahí este post. Seguramente si habéis buscado información por internet, asistido a algún webinar o charla, realizado algún curso,... sobre

Scrum

hayáis oído hablar de

Scrum Norris

. Pues bien, os recojo sus mejores habilidades y las enfrento con las de

SQL Server Norris

, cada uno sacará lo mejor de sí mismo para vencer, que empiece el combate, ¡¡¡Fight!!!


SQL Server Norris


  1. SQL Server Norris

    no hace backups, los datos no se atreven a perderse sin su permiso.
  2. SQL Server Norris

    utiliza siempre el usuario 'sa' sin contraseña, nadie tiene el valor de acceder a sus instancias SQL Server.
  3. SQL Server Norris

    es capaz de hacer un backup y un restore de la misma base de datos al mismo tiempo; mientras se realiza aprovecha para liberar unos rehenes.
  4. El plan de ejecución de las consultas no lo selecciona el optimizador, lo decide

    SQL Server Norris

    .
  5. Cuando una consulta es lenta

    SQL Server Norris

    no la optimiza, compra un servidor con más recursos.
  6. SQL Server Norris

    utiliza la misma consulta para todo, SELECT * FROM *.
  7. SQL Server Norris

    tiene deshabilitado el Agente de SQL Server, él lanza todos los trabajos de forma manual 24 horas al día los 365 días del año.
  8. SQL Server Norris

    no define Primary Keys, ¡¡es un invento de los terroristas!!
  9. SQL Server Norris

    es capaz de hacer backups con el servidor apagado.
  10. SQL Server Norris

    monta un cluster de SQL Server con una PlayStation y una tostadora; aprovecha los recursos sobrantes del cluster para hacer ciberataques a los enemigos.

Scrum Norris


  1. Scrum Norris

    no prioriza el Backlog, no es necesario, en cada Sprint lo realiza por completo.
  2. Cuando

    Scrum Norris

    hace Kanban no mueve los posits, mueve el tablero.
  3. Scrum Norris

    es StakeHolder, ProductOwner, ScrumMaster y ScrumTeam al mismo tiempo.
  4. Scrum Norris

    hace Sprints de 6 meses o 1 año, lo decide en el Daily Meeting.
  5. Scrum Norris

    no estima tareas, las tareas tardan lo que

    Scrum Norris

    diga.
  6. Scrum Norris

    llega al Sprint Planning con las tareas ya acabadas y recién duchado tras su paso por el gimnasio.
  7. Scrum Norris

    no hace Retrospective, en sus Sprints no hay nada que mejorar.
  8. Scrum Norris

    no hace tests, todo funciona a la primera sin necesidad de ser probado.
  9. Durante cada Sprint

    Scrum Norris

    hace tareas del Sprint, tareas del Backlog, tareas que todavía no ha pensado el Product Owner y tareas del sprint de los vecinos de abajo.
  10. Scrum Norris

    no sube los cambios a producción, producción baja a por los cambios que ha hecho

    Scrum Norris

    .






Y hasta aquí el artículo de hoy, espero que os hayáis echado unas risas, je je je... ¿se os ocurren más habilidades para

Scrum Norris

o

SQL Server Norris

? Seguro que sí, no dudéis en compartirlas con los todos los lectores del blog, seguro que las hay mejores!! Recordad también que dentro de

areaTIC

podéis encontrar otros artículos, consultar nuestro archivo o seguirnos por RSS y las principales redes sociales (twitter, facebook, linkedin...) 


LECTURAS RELACIONADAS RECOMENDADAS

viernes, 15 de febrero de 2013

WCF - Cómo añadir metadatos a una instancia de ServiceHost

En el artículo de hoy veremos como publicar metadatos asociados a una instancia de la clase

ServiceHost

. A la hora de hospedar un servicio

WCF

tenemos varias alternativas como IIS, servicios de windows, Windows Activation Services o directamente creando nuestra propia aplicación windows o consola y controlada cada instancia de servicio por código.

A priori, hay veces que el escenario marca un poco el sistema que escogeremos. Por ejemplo si van a conectar clientes que no sean

WCF

es casi obligado hospedar los servicios en un IIS. En caso que sepamos con toda seguridad que los clientes serán WCF recomendaría crearnos una aplicación y controlar nosotros mismos la instancia de la clase

ServiceHost

de cada servicio. ¿Qué ventajas hay respecto a hospedar en un IIS?

  • Podemos configurar un binding NetTcpBinding que será más rápido que un binding por protocolo http.
  • Es más sencillo controlar temas avanzados del Hosting respecto al resto de alternativas
  • Requiere menos infraestructura

Levantar una instancia de servicio y hospedarla en una aplicación de tipo consola o windows es relativamente sencillo, hemos de crearnos un binding del tipo que consideremos, la dirección y poco más... La cosa se complica un poco si queremos publicar metadatos asociados al servicio, veamos como hacerlo:
  //address - Uri
  Uri Uri = new System.Uri("net.tcp://localhost/Services/");
  ServiceHost svc = new ServiceHost(typeof(ServiceAreaTicSample), Uri);

  #region netTcpBinding
  NetTcpBinding bindingDefault = new NetTcpBinding(SecurityMode.None);
  svc.AddServiceEndpoint("AreaTIC.WCFServer.IServiceAreaTicSample",bindingDefault, "AreaTicSample");
  #endregion
            
  #region Metadatos
  ServiceMetadataBehavior smb = svc.Description.Behaviors.Find<ServiceMetadataBehavior>();
  if (smb == null)
     smb = new ServiceMetadataBehavior();
            
  svc.Description.Behaviors.Add(smb);
  // Add MEX endpoint
  svc.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,MetadataExchangeBindings.CreateMexTcpBinding(),"mex");
  svc.Open();
  #endregion
Con esto ya tendríamos un servicio con metadatos publicados lo cual implica que podríamos crear un cliente fácilmente a partir de la URL en la que hemos publicado los metadatos.

WCF - Cómo añadir metadatos a una instancia de ServiceHost

Los metadatos en este caso no serían equivalentes a un documento Wsdl, aunque sin cambiar demasiado código podríamos definir un binding por protocolo http y configurar

ServiceMetadataBehavior

para que publique un documento Wsdl en la misma Url que hemos hospedado el servicio. Hasta aquí el artículo de hoy. Recordar que podéis seguir

areaTIC

en las redes sociales y/o rss y no os cortéis a la hora de participar!


martes, 12 de febrero de 2013

SQL Server: Hint MAXDOP

Antes de entrar en detalles sobre el

hint MAXDOP

explicaremos en qué consisten los

hints

(traducido literalmente "sugerencia", "insinuación"), son agregados a consultas SQL de tipo SELECT, INSERT, DELETE, UPDATE y MERGE que sustituyen cualquier plan de ejecución que pueda seleccionar el optimizador de consultas para la consulta que lo incluye. Partiendo de la base que el optimizador de consultas normalmente debería seleccionar el mejor plan de ejecución se debe ir con cuidado con el uso de los

hints

.

Podemos encontrar tres tipos de

hints

en

SQL Server

:

  • Join Hints

    , fuerzan el tipo de Join (LOOP, HASH, MERGE, REMOTE) que se va a usar en la consulta, por tanto, sólo aplica en consultas de tipo SELECT, DELETE y UPDATE. Podemos encontrar más información al respecto en el siguiente enlace del MSDN: Join Hints.

  • Query Hints

    , se aplican en consultas de tipo SELECT, INSERT (sólo cuando contiene una cláusula SELECT), DELETE, UPDATE y MERGE y pueden afectar a todas las partes de la consulta dependiendo del

    hint

    , por ejemplo:

    • HASH y ORDER afectan a las cláusulas GROUP BY o DISTINCT.
    • MERGE, HASH y CONCAT afectan a la cláusula UNION.
    • ...
    Para añadirlos utilizamos la cláusula OPTION, el

    hint MAXDOP

    es de este tipo (luego entraremos en más detalles sobre su uso). Podemos encontrar más información al respecto en el siguiente enlace del MSDN: Query Hints.

  • Table Hints

    (también conocidos como

    Lock Hints

    ), se aplican en consultas de tipo SELECT, INSERT (sólo cuando contiene una cláusula SELECT), DELETE, UPDATE y MERGE, invalidan el comportamiento predeterminado del optimizador de consultas mientras dura la instrucción DML (Data Manipulation Language) especificando un tipo de bloqueo, uno o más índices,... Estos

    hints

    se especifican en la cláusula FROM de la instrucción mediante la cláusula WITH y sólo afectan a la tabla o vista a la que se hace referencia en esa cláusula. Podemos encontrar más información al respecto en el siguiente enlace del MSDN: Table Hints.

Bien, tras la breve introducción anterior sobre qué son los

hints

vamos a entrar en detalles del

hint MAXDOP

, este

hint

invalida el valor del parámetro de configuración

max degree of parallelism

(máximo grado de paralelismo); si

MAXDOP

se establece a cero el servidor elige el grado máximo de paralelismo. Es decir, con el

hint MAXDOP

podemos configurar la consulta para que se ejecute en un nº concreto de CPUs (pero no podemos indicar cuáles). Veamos un ejemplo de su funcionamiento, supongamos la siguiente consulta en la base de datos AdventureWorks:
-- Obtenemos los contactos ordenados por apellido, nombre (sin MAXDOP)
SELECT *
FROM Person.Contact
ORDER BY LastName, FirstName
Obtenemos el siguiente plan de ejecución con el correspondiente coste de paralelismo (lo que cuesta hacer que la consulta se ejecute en varias CPUs, un 3% del total de la consulta).


Ahora ejecutamos la siguiente consulta con el

hint MAXDOP

= 1 para la consulta se ejecute en 1 única CPU.
-- Obtenemos los contactos ordenados por apellido, nombre (MAXDOP = 1)
SELECT *
FROM Person.Contact
ORDER BY LastName, FirstName
OPTION (MAXDOP 1)
Tras añadir el

hint MAXDOP

= 1 si observamos el plan de ejecución vemos que el coste de paralelismo ha desaparecido (al ejecutarse la consulta en una única CPU).


Entonces, si desaparece el coste de paralelismo ¿significa esto que la consulta es menos costosa si incluimos la cláusula correspondiente al

hint MAXDOP

? Ejecutemos las 2 consultas a la vez:
-- Obtenemos los contactos ordenados por apellido, nombre (sin MAXDOP)
SELECT *
FROM Person.Contact
ORDER BY LastName, FirstName

-- Obtenemos los contactos ordenados por apellido, nombre (MAXDOP = 1)
SELECT *
FROM Person.Contact
ORDER BY LastName, FirstName
OPTION (MAXDOP 1)
Y analicemos el plan de ejecución de nuevo, en este caso podemos ver que la consulta sin el

hint MAXDOP

, a pesar de tener el coste de paralelismo es más rápida que la consulta con el

hint MAXDOP

(34% del total del tiempo de ejecutar ambas frente a 66%), es decir, aunque ejecutar la consulta en N CPUs tenga un coste de paralelismo esta opción es más rápida que ejecutar la consulta en 1 CPU evitando el coste de paralelismo; cuidado, esto es para el ejemplo anterior, con otras consultas y/o servidor la cosa podría cambiar, no siempre es mejor o peor ejecutar una consulta con paralelismo, dependerá de cada caso.


Vayamos a un caso práctico, ¿para qué nos puede valer el

hint MAXDOP

? Imaginemos un servidor con una instancia de SQL Server que contiene 2 bases de datos A y B, sobre la base de datos A hay múltiples usuarios trabajando y sobre la B se están haciendo únicamente labores de mantenimiento, por ejemplo, regenerando los índices; pues bien, podemos hacer que las consultas de regeneración de índices de la base de datos B incluyan el

hint MAXDOP

= 1 (uso de una única CPU) para que éstas no utilicen todas las CPUs disponibles y así se vea afectado lo menos posible el rendimiento de los usuarios conectados a la base de datos A. ¿Se os ocurren otros casos? Seguro que sí, podéis añadir los comentarios que creáis oportunos al respecto.

Y hasta aquí el artículo de hoy, espero que os haya sido interesante. Recordad también que dentro de

areaTIC

podéis encontrar otros artículos, no dudéis en consultar nuestro archivo, también podéis seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...) 


LECTURAS RELACIONADAS RECOMENDADAS POR AREATIC.NET

viernes, 8 de febrero de 2013

ASP .NET - Cómo configurar un HttpModule en nuestro site

Hoy veremos como configurar un

HttpModule

en nuestro site. En primer lugar a modo muy resumido decir que un

Module

es una clase que podemos configurar para que toda petición HTTP que reciba nuestro site produzca una serie de determinados eventos a partir de los cuales podremos realizar acciones sobre la petición y/o redirigirla a donde creamos oportuno.

En primer lugar hemos de crear una clase en nuestro site y haremos que implemente la interfaz

IHttpModule

.
namespace AreaTIC.Code.Modules
{
  public class AreaTICModule:IHttpModule
  {
    public void Dispose()
    {
      throw new NotImplementedException();
    }

    public void Init(HttpApplication context)
    {
      throw new NotImplementedException();
    }
  }
}
Si nos fijamos en la imagen veremos que en la instancia

HttpApplication

tenemos acceso a determinados eventos que dependiendo que comportamiento necesitemos personalizar podemos delegar en un método privado de nuestro

module

.

ASP .NET  - Configurar HttpModule en nuestro site

A continuación implementaremos un método delegado "OnEndResponse" que se encargará de añadir un pie de página al response por defecto que ha devuelto el servidor, veamos como hacerlo:
namespace Web.Code.Modules
{
  public class AreaTICModule:IHttpModule
  {

    public void Dispose()
    {
       throw new NotImplementedException();
    }

    public void Init(HttpApplication context)
    {
       context.EndRequest += new EventHandler(this.OnEndRequest);
    }

    private void OnEndRequest(object sender, EventArgs e)
    {
       HttpApplication app = (HttpApplication)sender;
       app.Response.Write("AreaTIC © 2013");
    }
  }
}
Con esto habríamos programado que siempre que se produzca una petición a nuestro site, el servidor responderá con el contenido correspondiente pero siempre añadirá el texto "

AreaTIC

© 2013" al final del contenido de la página.

Por último veremos como configurar el site para que tenga en cuenta el Module personalizado que acabamos de crear, para ello añadiremos la siguiente configuración al archivo web.config del site. Dependiendo de la configuración del Pool de aplicaciones que ejecute el site en

IIS

variará el modo de registrar el module en web.config:

  • Canalización Clásica
  • <system.web>
      <httpModules>
        <add name="AreaTICModule" type="Web.Code.Modules.AreaTICModule"/>
      </httpModules>
    </system.web>
    

  • Integrada
  • <system.webServer>
      <modules runAllManagedModulesForAllRequests="true">
         <add name="AreaTICModule" type="Web.Code.Modules.AreaTICModule"/>
      </modules>
    </system.webServer>
    

Espero os sea de utilidad, recordar que podéis seguir

areaTIC

en las redes sociales!


martes, 5 de febrero de 2013

Blogger: widget para votar/valorar posts (rating posts)

En el artículo de hoy os mostraré un

widget

que podéis utilizar en

Blogger

(o cualquier otro CMS como

Wordpress, Drupal,

...) que permite

votar/valorar posts

y muestra una media de todas las votaciones así como el detalle de todos votos que ha habido de cada tipo.


En este sentido, el mejor

widget

que he encontrado para

votar/valorar posts

es el rating-widget y entre sus características destacan:

  • Es multidioma con la posibilidad de elegir entre más de 40 distintos.
  • Podemos personalizar la forma en la que se visualizan los votos/valoraciones de los posts: estrellas, favor/contra, colores, tamaños,...
  • Permite definir tipo de letra, tamaño, color, personalizar los textos...

Vamos, que te lo puedes personalizar para que difícilmente te encuentres otro igual, je je je...No os voy a dar los detalles de cómo añadirlo en vuestro sitio ya que en su blog ya está explicado con suficiente detalle... eso sí, dentro del tutorial explica que puedes añadirlo pulsando directamente el botón "Add to

Blogger

" pero no conseguí que funcionara, al final lo hice copiando el código que genera y añadiéndolo a la plantilla de este

blog

(puedes ver el resultado en el pie de página, junto a los iconos de compartir en las redes sociales).

El código que te genera es similar al siguiente (dependerá de tu user-key y los valores con los que lo hayas personalizado):

<!-- Add this element exactly where you want the Widget to appear -->

<div class="rw-ui-container rw-urid-1"></div>

<!--
    You can add more Rating-Widgets in your site,
    just pick some new rating-widget-unique-id (must be positive integer)
    For example (rating-widget-unique-id = 38):
    <div class="rw-ui-container rw-urid-38"></div>
-->

<!-- Add this javascript code immediately before the </body> tag -->
<div class="rw-js-container">
    <script type="text/javascript">
        // Async Rating-Widget initialization.
        function RW_Async_Init(){
            RW.init("2D26808A85BE11723B047Axxxxxxxxxx",
            {
                advanced: {
                    font: {
                        hover: {
                            color: "#888888"
                        },
                        color: "#888888",
                        type: "verdana",
                        size: "10px"
                    },
                    layout: {
                        align: {
                            hor: "left"
                        },
                        dir: "rtl",
                        lineHeight: "18px"
                    },
                    text: {
                        rateAwful: "Pésimo",
                        ratePoor: "Malo",
                        rateAverage: "Regular",
                        rateGood: "Bueno",
                        rateExcellent: "Excelente",
                        rateThis: "Valora este artículo",
                        vote: "Valorar",
                        votes: "Valoraciones"
                    }
                },
                lng: "es",
                theme: "star_quartz",
                type: "star"
            });
            RW.render();
        }

        // Append Rating-Widget JavaScript library.
        if (typeof(RW) == "undefined"){
          (function(){
             var rw = document.createElement("script");
             rw.type = "text/javascript"; rw.async = true;
             rw.src = "http://js.rating-widget.com/external.min.js?t=js";
             var s = document.getElementsByTagName("script")[0];
             s.parentNode.insertBefore(rw, s);
          })();
        }
    </script>
</div>

Hasta aquí todo normal, lo añades en

Blogger

(directamente a la plantilla o añadiendo un gadget de tipo HTML/Javascript), te aparece el

widget

, pruebas a

votar/valorar un post

y perfecto... vas a otro post y upsss, sale el voto del post anterior... es decir los votos son globales para todo el sitio!!! Vamos a solucionarlo, si os fijáis dentro del código que habéis pegado hay el siguiente texto comentado:

<!-- Add this element exactly where you want the Widget to appear -->

<div class="rw-ui-container rw-urid-1"></div>

<!--
    You can add more Rating-Widgets in your site,
    just pick some new rating-widget-unique-id (must be positive integer)
    For example (rating-widget-unique-id = 38):
    <div class="rw-ui-container rw-urid-38"></div>
-->
...

Nos indica que podemos añadir el

widget

N veces en nuestro blog para tener N votaciones si cada vez le indicamos un número entero diferente en la primera etiqueta <div>:

<!-- Add this element exactly where you want the Widget to appear -->

<div class="rw-ui-container rw-urid-[Nº entero diferente]"></div>
...

¿Y cómo hacemos esto en

Blogger

? Muy sencillo, utilizamos la potencia de las plantillas de

Blogger

para poner como entero que identifique el

widget

el identificador del post que genera

Blogger

, así de esa manera cada vez que añadamos un post a nuestro blog tendremos un

widget

con un nuevo identificador y por tanto una nueva votación para nuestro nuevo post. Es tan sencillo como cambiar la primera etiqueta <div>:

<!-- Add this element exactly where you want the Widget to appear -->

<div class="rw-ui-container rw-urid-1"></div>

...

por la siguiente:

<!-- Add this element exactly where you want the Widget to appear -->

<div expr:class=’"rw-ui-container rw-urid-"+data:post.id’/>

...

Volvéis a probar y solucionado!!! Cada post tiene su propia votación/valoración!!! Ahora sólo se trata que personalicéis el

widget para votar/valorar posts

a vuestro gusto y listos, a recibir feedback de vuestros lectores.

Y hasta aquí el artículo de hoy, espero que os haya sido interesante, podéis empezar por votarlo (por supuesto como excelente, ja ja ja) y luego añadir el

widget

a vuestro blog. Recordad también que dentro de

areaTIC

podéis encontrar otros artículos, no dudéis en consultar nuestro archivo; también puedes seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...)


sábado, 2 de febrero de 2013

WCF AsyncPattern, ejemplo práctico sobre cómo aplicar el patrón en nuestros servicios

En artículos anteriores (ChannelFactory<T>,AreaTicProxy<T>) vimos como crear nuestra propia clase proxy para conectar a un servicio WCF evitando crear un "service reference" con svcUtil. Hoy veremos como implementar

IAsyncPattern

en nuestro servicio que vendría a ser equivalente a marcar esta opción de la imagen al crear un "service reference" y así usando la clase proxy del artículo anterior podríamos invocar los métodos de nuestros servicio en modo asíncrono.


Veamos como aplicar el patrón en nuestro servicio de ejemplo que creamos en el artículo anterior, necesitaremos definir 2 métodos en la interfaz por cada método que queramos hacer asíncrono. Por tanto hemos definido BeginFuncionEjemplo que recibirá, a parte de los parámetros del método original, un parámetro

AsyncCallback

y definimos también EndFuncionEjemplo que devuelve como resultado un string igual que el método síncrono FuncionEjemplo. Es importante añadir el atributo [OperationContract(AsyncPattern = true)] a los métodos asíncronos.
namespace AreaTIC.Shared.ServiceContracts
{
 [ServiceContract]
 public interface IServiceEjemplo
 {
  [OperationContract]
   string FuncionEjemplo(Tipo1 pValue);

   #region Asíncronos

   [OperationContract(AsyncPattern = true)]
   IAsyncResult BeginFuncionEjemplo(Tipo1 pValue, AsyncCallback callback, object state);
   string EndFuncionEjemplo(IAsyncResult asyncResult);

   #endregion
 }
}
En el servicio implementaremos la interfaz pero no es necesario implementar los métodos.
namespace AreaTIC.Server.Services
{
 public class ServiceEjemplo:IServiceEjemplo
 {
  string IServiceEjemplo.FuncionEjemplo(Tipo1 pValue)
  {
    Thread.Sleep(5000);

    //Implementación (...)

    return "bla bla";
  }

  public IAsyncResult BeginFuncionEjemplo(Tipo1 pValue, AsyncCallback callback, object state)
  {
    throw new NotImplementedException();
  }

  public string EndFuncionEjemplo(IAsyncResult asyncResult)
  {
    throw new NotImplementedException();
  }
 }
}
Ahora veremos ya en cliente como llamar al método asíncrono del servicio usando el proxy basado en

ChannelFactory<T>

que creamos en el artículo anterior. En primer lugar necesitaremos una función que reciba un parámetro IAsyncResult a la que he llamado Respuesta, el siguiente paso es llamar a BeginFuncionEjemplo asignando el método this.Respuesta al delegado

AsyncCallback

.
 AreaTicWCFProxy mProxy;
     
 void Llamada()
 {
   mProxy = new AreaTicWCFProxy("EjemploAreaTIC");
   mProxy.client.BeginFuncionEjemplo(new Tipo1(),new AsyncCallback(this.Respuesta), null);
   Console.WriteLine("sigo con la ejecución del método Main");
   Console.Read();
 }

 void Respuesta(IAsyncResult asyncResult) 
 {
   string result = mProxy.client.EndFuncionEjemplo(asyncResult).ToString();
   Console.Write(result);
   Console.ReadLine();
 }
Es importante declarar la instancia de

AreaTicWCFProxy

en un ámbito de clase para tener acceso a la misma instancia desde las dos funciones.

En resumen, en los tres últimos artículos de la sección WCF-ChannelFactory hemos visto como crear nuestra clase proxy personalizada por pasos que puede ser muy útil si trabajáis en una arquitectura dónde las aplicaciones acceden a datos mediante servicios

WCF

.

Hasta aquí el artículo de hoy. Recuerda que puedes seguir

areaTIC

también en las redes sociales, esperamos tu participación!