<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>{ WillyXoft .NET }</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/default.aspx</link><description>Blog de Willy Mejía sobre Microsoft .NET Framework y temas relacionados...</description><dc:language>es-MX</dc:language><generator>CommunityServer 1.0 (Build: 1.0.1.50214)</generator><item><title>WCF bajo Contrato (4/4)</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/07/05/484215.aspx</link><pubDate>Sat, 05 Jul 2008 16:03:49 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:484215</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/484215.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=484215</wfw:commentRss><description>&lt;h3&gt;&lt;a name="contrato-fallo"&gt;Contrato de Fallo&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Cualquier operación petición/respuesta devuelve dos posibles mensajes: su mensaje de respuesta normal, o bien un mensaje de error. Para enviar un mensaje de error (un "SOAP Fault" en términos de servicios web) se lanza una &lt;strong&gt;FaultException&lt;/strong&gt; en la implementación del servicio, tal y como se ha ejemplificado hasta ahora.&lt;/p&gt; &lt;p&gt;Pero además se pueden especificar formalmente los mensajes de error utilizando tipos personalizados con un contrato de datos adecuado, dado que se serializarán mediante el DataContractSerializer. El tipo a utilizar en el mensaje de error se especifica contractualmente en la firma de la operación utilizando el atributo &lt;b&gt;FaultContract&lt;/b&gt;, mientras que en la implementación de la operación se genera mediante una FaultException del tipo especificado en el FaultContract.&lt;/p&gt; &lt;p&gt;Como ejemplo suponga que deseamos especificar un mensaje de error, que nos informe sobre un error en el parámetro de la petición, utilizando el siguiente tipo con su contrato de datos:&lt;/p&gt; &lt;p&gt;&lt;b&gt;Listado de HelloData.cs (fragmento)&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;&lt;b&gt;[DataContract(Namespace="http://hello/data/")]&lt;/b&gt;
public class &lt;b&gt;InvalidRequest&lt;/b&gt;
{
  private int id;
  private string message;
  private string notes;

  &lt;b&gt;[DataMember()]&lt;/b&gt;
  public int ID
  {
    get { return id; }
    set { id = value; }
  }

  &lt;b&gt;[DataMember()]&lt;/b&gt;
  public string Message
  {
    get { return message; }
    set { message = value; }
  }				

  &lt;b&gt;[DataMember()]&lt;/b&gt;
  public string Notes
  {
    get { return notes; }
    set { notes = value; }
  }				
}&lt;/pre&gt;
&lt;p&gt;El fragmento de código se agrega al archivo HelloData.cs, tras lo cual lo compilamos.&lt;/p&gt;
&lt;p&gt;Para especificar el uso del tipo InvalidRequest como &lt;em&gt;tipo de fallo&lt;/em&gt; sobre la operación, aplicamos el atributo FaultContract a la firma de la operación:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Hello.cs (fragmento)&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;[ServiceContract(Namespace="http://hello/", Name="Hello")]
interface IHello
{
  [OperationContract()]
  &lt;b&gt;[FaultContract(typeof(InvalidRequest))]
  &lt;/b&gt;SayHelloResponse SayHello(SayHelloRequest request);
}&lt;/pre&gt;
&lt;p&gt;Después en la clase de implementación del servicio se lanzan las excepciones correspondientes:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Hello.cs (fragmento)&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;  [ServiceBehavior(Namespace="http://hello/", Name="HelloService")]
  public class Hello : IHello
  {
    private StringBuilder message = new StringBuilder("¡Hola ");

    &lt;b&gt;private void ValidateRequest(SayHelloRequest request)&lt;/b&gt;
    {
      if (request.PersonParameter == null)
      {
        InvalidRequest fault = new InvalidRequest();
        fault.ID = 1;
        fault.Message = "Parámetro Person inválido";
        fault.Notes = "El objeto Person no puede ser nulo...";
        &lt;b&gt;throw new FaultException&amp;lt;InvalidRequest&amp;gt;(fault, "Parámetro inválido.");&lt;/b&gt;
      }
      else if (request.PersonParameter.FirstName == null ||
        request.PersonParameter.FirstName.Length == 0)
      {
        InvalidRequest fault = new InvalidRequest();
        fault.ID = 2;
        fault.Message = "Miembro FirstName inválido";
        fault.Notes = "El miembro FirstName del objeto Person no puede ser nulo o vacío...";
        &lt;b&gt;throw new FaultException&amp;lt;InvalidRequest&amp;gt;(fault, "Parámetro inválido.");&lt;/b&gt;
      }
    }

    public SayHelloResponse SayHello(SayHelloRequest request)
    {
      &lt;b&gt;ValidateRequest(request);&lt;/b&gt;

      message.Append(request.PersonParameter.FirstName + "!");
      string msg = message.ToString();
      SayHelloResponse response = new SayHelloResponse();
      HelloCard card = new HelloCard();
      card.Greeting = msg;
      response.HelloCardResult = card;
      System.Console.WriteLine(msg);
      return response;
    }
  }&lt;/pre&gt;
&lt;p&gt;Nótese que hemos extraído el código de validación del request en un método privado, en el cual se crea una instancia de InvalidRequest, se establece la información pertinente, y se lanza un FaultException con dicha instancia. Note además que se hace el uso de la versión "genérica" de FaultException para ello.&lt;/p&gt;
&lt;p&gt;Compilamos Hello.cs, y para terminar del lado del servicio sólo ejecutamos la aplicación host.&lt;/p&gt;
&lt;p&gt;Para el cliente una vez más se regeneran los artefactos cliente con svcutil.exe. &lt;/p&gt;
&lt;p&gt;Después, aunque el código de la aplicación cliente podría funcionar sin cambios, para poder consumir los mensajes adicionales de error (de tipo InvalidRequest) ahora agregaremos un &lt;i&gt;catch&lt;/i&gt; para "atrapar" el FaultException de tipo InvalidRequest. El listado de Client.cs queda de la siguiente manera:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Client.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;
using System.ServiceModel;

public class Client
{
  static void Main(string[] args)
  {
    String arg = null;
    String result = null;
    if (args.Length &amp;gt; 0) {
      arg = args[0];
    }
    else {
      arg = "Anónimo";
    }
    try {
      hello.Hello service = new hello.HelloClient();
      hello.data.Person person = new hello.data.Person();
      person.FirstName = arg;
      hello.SayHelloRequest request = new hello.SayHelloRequest();
      request.Person = person;
      hello.SayHelloResponse response = service.SayHello(request);
      result = response.HelloCard.Greeting;
    }
    &lt;b&gt;catch (FaultException&amp;lt;hello.data.InvalidRequest&amp;gt; helloFault)&lt;/b&gt;
    {
      &lt;b&gt;result = String.Format("{0}\nID: {1}\nMensaje: {2}\nNotas: {3}",&lt;/b&gt;
                &lt;b&gt;helloFault.Message,&lt;/b&gt;
                &lt;b&gt;helloFault.Detail.ID,&lt;/b&gt;
                &lt;b&gt;helloFault.Detail.Message,&lt;/b&gt;
                &lt;b&gt;helloFault.Detail.Notes);&lt;/b&gt;
    }
    catch (FaultException fault) {
      result = "Fault: " + fault.Message;
    }
    catch (Exception ex) {
      result = "Error: " + ex.ToString();
    }
    finally{
      System.Console.WriteLine(result);
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Observe que para acceder a los miembros de la instancia de InvalidRequest enviada utilizamos la propiedad &lt;strong&gt;Detail&lt;/strong&gt; de la instancia de FaultException &lt;em&gt;helloFault&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Compilamos el proxy y el cliente, y ejecutamos Client.exe. Pruebe las excepciones modificando el código de la aplicación cliente, ya sea estableciendo a nulo el valor del miembro FirstName o el parámetro Person, y volviendo a compilar y ejecutar...&lt;/p&gt;
&lt;h3&gt;Epílogo&lt;/h3&gt;
&lt;p&gt;Con los ejemplos vistos en la presente serie se han explorado brevemente los diferentes tipos de contratos de WCF: contrato de servicio, contrato de datos, contrato de mensajes y contrato de fallo. Los mismos se definen aplicando ciertos atributos a clases y sus miembros. Los atributos permiten parámetros por nombre, tales como el Namespace y Name,&amp;nbsp; para una mejor definición del elemento al cual se aplica. Queda como tarea para el lector que indague sobre dichos parámetros, ya que existen muchos otros en cada uno de los distintos atributos.&lt;/p&gt;
&lt;p&gt;Quedan pendientes entonces varias cosas, además del nuevo cliente Java, mismas que espero abordar en futuras ocasiones. ¡Hasta entonces!&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=484215" width="1" height="1"&gt;</description></item><item><title>WCF bajo Contrato (3/4)</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/07/04/484035.aspx</link><pubDate>Fri, 04 Jul 2008 20:01:04 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:484035</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/484035.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=484035</wfw:commentRss><description>&lt;h3&gt;&lt;a name="contrato-mensajes"&gt;Contrato de Mensajes&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Hasta ahora se ha redefinido el &lt;a href="http://willyxoft.wordpress.com/2008/07/02/contratos-wcf-p1/"&gt;contrato de servicio&lt;/a&gt; utilizando una interfaz, así como empleado tipos personalizados con &lt;a href="http://willyxoft.wordpress.com/2008/07/03/contratos-wcf-p2/"&gt;contrato de datos&lt;/a&gt; definidos, lo cual es suficiente en la mayoría de los casos. &lt;/p&gt; &lt;p&gt;Pero cuando se desea tener mayor control sobre la estructura de los mensajes SOAP debemos crear un &lt;strong&gt;contrato de mensajes&lt;/strong&gt; el cual permite utilizar un tipo para el parámetro y el valor devuelto que se serialicen en los mensajes SOAP de solicitud y respuesta que se necesiten.&lt;/p&gt; &lt;p&gt;A éste estilo de modelado de las operaciones se le conoce como &lt;b&gt;estilo de mensajería&lt;/b&gt;, en contraposición al &lt;i&gt;estilo de llamada de procedimiento remoto (RPC)&lt;/i&gt;. Las firmas de las operaciones de estilo de mensajería tienen hasta un parámetro y un valor de retorno y ambos deben ser &lt;i&gt;tipos de mensaje&lt;/i&gt; que se serializan directamente en una estructura del mensaje SOAP especificado.&lt;/p&gt; &lt;p&gt;Para definir el contrato de mensajes debemos aplicar el atributo &lt;b&gt;MessageContract&lt;/b&gt; a las clases que vayan ser los &lt;i&gt;tipos de mensaje&lt;/i&gt;. Así también debemos aplicar el atributo &lt;b&gt;MessageBodyMember&lt;/b&gt; a sus miembros (que pueden ser campos, propiedades o eventos) que serán los elementos del cuerpo del mensaje SOAP, o bien el atributo &lt;b&gt;MessageHeader&lt;/b&gt; para especificar el encabezado del mensaje.&lt;/p&gt; &lt;p&gt;Podriamos haber empleado el contrato de mensajes desde la versión del servicio que empleaba tipos simples, en cuyo caso podría ser algo como:&lt;/p&gt;&lt;pre&gt;&lt;b&gt;[MessageContract()]&lt;/b&gt;
public class SayHelloRequest
{
  &lt;b&gt;[MessageBodyMember()]&lt;/b&gt;
  public string name
}

&lt;b&gt;[MessageContract()]&lt;/b&gt;
public class SayHelloResponse
{
  &lt;b&gt;[MessageBodyMember()]&lt;/b&gt;
  public string greeting
}&lt;/pre&gt;
&lt;p&gt;Pero continuando con nuestro ejemplo, los contratos de mensaje para la operación SayHello quedan de la siguiente forma:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Hello.cs (fragmento)&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;&lt;b&gt;using hello.data;&lt;/b&gt;

  &lt;b&gt;[MessageContract()]&lt;/b&gt;
  public class SayHelloRequest
  {
    private Person person;

    &lt;b&gt;[MessageBodyMember(Name="Person")]&lt;/b&gt;
    public Person PersonParameter
    {
      get { return person; }
      set { person = value; }
    }
  }

  &lt;b&gt;[MessageContract()]&lt;/b&gt;
  public class SayHelloResponse
  {
    private HelloCard helloCard;

    &lt;b&gt;[MessageBodyMember(Name="HelloCard")]&lt;/b&gt;
    public HelloCard HelloCardResult
    {
      get { return helloCard; }
      set { helloCard = value; }
    }
  }&lt;/pre&gt;
&lt;p&gt;Nótese que se trata de clases "planas" con atributos, y que los elementos del cuerpo de los mensajes son los tipos personalizados con contratos de datos definidos anteriormente en HelloData.cs.&lt;/p&gt;
&lt;p&gt;Para utilizar los tipos de mensaje ahora la firma del contrato de servicio debe redefinirse como sigue:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Hello.cs (fragmento)&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;[ServiceContract(Namespace="http://hello/", Name="Hello")]
interface IHello
{
  [OperationContract()]
  &lt;b&gt;SayHelloResponse SayHello(SayHelloRequest request);&lt;/b&gt;
}&lt;/pre&gt;
&lt;p&gt;Por lo que también debemos reescribir su implementación. El listado completo de Hello.cs queda entonces de la siguiente forma:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Hello.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;
using System.Text;
using System.ServiceModel;
using hello.data;

namespace hello
{

  [MessageContract()]
  public class &lt;strong&gt;SayHelloRequest&lt;/strong&gt;
  {
    private Person person;

    [MessageBodyMember(Name="Person")]
    public Person PersonParameter
    {
      get { return person; }
      set { person = value; }
    }
  }

  [MessageContract()]
  public class &lt;strong&gt;SayHelloResponse&lt;/strong&gt;
  {
    private HelloCard helloCard;

    [MessageBodyMember(Name="HelloCard")]
    public HelloCard HelloCardResult
    {
      get { return helloCard; }
      set { helloCard = value; }
    }
  }
  
  [ServiceContract(Namespace="http://hello/", Name="Hello")]
  interface IHello
  {
    [OperationContract()]
    &lt;strong&gt;SayHelloResponse SayHello(SayHelloRequest request);&lt;/strong&gt;
  }

  [ServiceBehavior(Namespace="http://hello/", Name="HelloService")]
  public class Hello : IHello
  {
    private StringBuilder message = new StringBuilder("¡Hola ");

    &lt;strong&gt;public SayHelloResponse SayHello(SayHelloRequest request)&lt;/strong&gt;
    {
      if (request.PersonParameter == null ||
          request.PersonParameter.FirstName == null ||
          request.PersonParameter.FirstName.Length == 0)
        throw new FaultException(
            "Parámetro Person inválido.");

      &lt;strong&gt;message.Append(request.PersonParameter.FirstName + "!");&lt;/strong&gt;
      string msg = message.ToString();
      &lt;strong&gt;SayHelloResponse response = new SayHelloResponse();&lt;/strong&gt;
      HelloCard card = new HelloCard();
      card.Greeting = msg;
      &lt;strong&gt;response.HelloCardResult = card;&lt;/strong&gt;
      System.Console.WriteLine(msg);      
      &lt;strong&gt;return response;&lt;/strong&gt;
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Las clases de los archivos HelloData.cs y HelloHost.cs permanecen sin cambios. Por lo que del lado del servicio únicamente compilamos el archivo Hello.cs:&lt;/p&gt;&lt;pre&gt;&amp;gt;csc /t:library Hello.cs /r:System.ServiceModel.dll,HelloData.dll&lt;/pre&gt;
&lt;p&gt;...y ejecutamos la aplicación host.&lt;/p&gt;
&lt;p&gt;Continuemos con el cliente. Primero debemos (una vez más) regenerar los artefactos cliente con svcutil.exe, y después modificar el código de Client.cs como se muestra a continuación:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Client.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;

public class Client
{
  static void Main(string[] args)
  {
    String arg = null;
    String result = null;
    if (args.Length &amp;gt; 0) {
      arg = args[0];
    }
    else {
      arg = "Anónimo";
    }
    try {
      hello.Hello service = new hello.HelloClient();         
      hello.data.Person person = new hello.data.Person();
      person.FirstName = arg;
      &lt;strong&gt;hello.SayHelloRequest request = new hello.SayHelloRequest();&lt;/strong&gt;
      &lt;strong&gt;request.Person = person;&lt;/strong&gt;
      &lt;strong&gt;hello.SayHelloResponse response = service.SayHello(request);&lt;/strong&gt;
      &lt;strong&gt;result = response.HelloCard.Greeting;&lt;/strong&gt;
    }
    catch (System.ServiceModel.FaultException fault)
    {
      result = "Fault: " + fault.Message;
    }
    catch (Exception ex) {
      result = ex.ToString();
    }
    finally{
      System.Console.WriteLine(result);
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Nótese que antes del llamado al método SayHello se deben crear una instancia del tipo de mensaje SayHelloRequest, así como el tipo Person para su miembro correspondiente. La invocación retorna una instancia del tipo de mensaje SayHelloResponse mediante la cual se recupera el mensaje a desplegar. Note también que los elementos de los mensajes tienen los nombres especificados en el argumento por nombre "Name" del atributo MessageBodyMember correspondiente.&lt;/p&gt;
&lt;p&gt;Para finalizar compilamos el proxy y la aplicación cliente, y ejecutamos Client.exe como hasta ahora.&lt;/p&gt;
&lt;p&gt;Dado que en el presente ejemplo no hemos empleado el contrato de mensajes para nada extraordinario, el uso del mismo pareciera una sobrecarga innecesaria. Pero tenga presente que es útil para aquellos casos en los cuales se requiere tener control sobre los elementos o cabecera del mensaje, tales como la resolución de problemas de seguridad del mensaje o problemas de interoperabilidad.&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=484035" width="1" height="1"&gt;</description></item><item><title>WCF bajo contrato (2/4)</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/07/03/483623.aspx</link><pubDate>Thu, 03 Jul 2008 16:01:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:483623</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/483623.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=483623</wfw:commentRss><description>&lt;h3&gt;&lt;a name="contrato-datos"&gt;Contrato de Datos&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;WCF emplea, de forma predeterminada, a la clase &lt;strong&gt;DataContractSerializer&lt;/strong&gt; como mecanismo de serialización de datos .NET desde y hacia XML, el cual requiere que los tipos tengan un contrato de datos definido. &lt;/p&gt; &lt;p&gt;Hasta ahora el servicio utiliza tipos simples (string) para el intercambio de datos (en el parámetro de entrada y el valor devuelto) sin ninguna preparación. Esto se debe a que ciertos tipos del .NET Framework, entre ellos los "primitivos", tienen contratos de datos predeterminados. Si lo desea puede consultar la lista de los &lt;a href="http://msdn.microsoft.com/library/ms731923.aspx"&gt;tipos admitidos por el DataContractSerializer&lt;/a&gt;.  &lt;p&gt;En caso que deseáramos utilizar nuestros propios tipos de datos, necesitamos definir tipos complejos. Para ello debemos crear tipos que tengan un contrato de datos definido, lo cual conseguimos aplicando el atributo &lt;b&gt;DataContract&lt;/b&gt; a las clases, estructuras y/o enumeraciones a ser serializables por el DataContractSerializer. Además de lo anterior debemos aplicar el atributo &lt;strong&gt;DataMember&lt;/strong&gt; a los miembros que deseemos sean serializables, sin que importe su modificador de acceso.&lt;/p&gt; &lt;p&gt;Continuando con nuestro ejemplo, supongamos que ahora deseamos utilizar los siguientes tipos para el intercambio de datos:&lt;/p&gt; &lt;p&gt;&lt;b&gt;Listado de HelloData.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;&lt;b&gt;
using System.Runtime.Serialization;&lt;/b&gt;

namespace hello.data
{
    &lt;strong&gt;[DataContract(Namespace="http://hello/data/")]&lt;/strong&gt;
    public class Person
    {
        private string firstName;
        private string lastName;

        &lt;strong&gt;[DataMember()]&lt;/strong&gt;
        public string FirstName
        {
            get { return firstName; }
            set { firstName = value; }
        }

        &lt;strong&gt;[DataMember()]&lt;/strong&gt;
        public string LastName
        {
            get { return lastName; }
            set { lastName = value; }
        }
    }

    &lt;strong&gt;[DataContract(Namespace="http://hello/data/")]&lt;/strong&gt;
    public class HelloCard
    {
        private string greeting;
        private int serial;

        &lt;strong&gt;[DataMember()]&lt;/strong&gt;
        public string Greeting
        {
            get { return greeting; }
            set { greeting = value; }
        }

        public int Serial
        {
            get { return serial; }
            set { serial = value; }
        }
    }
}&lt;/pre&gt;
&lt;p&gt;Nótese que son clases "planas" con los atributos que definen el contrato de datos. Observe también la declaración del espacio de nombre del .NET Framework: &lt;i&gt;System.Runtime.Serialization&lt;/i&gt;, a cuyo ensamblado debemos referenciar para compilar HelloData.cs:&lt;/p&gt;&lt;pre&gt;&gt;csc /t:library HelloData.cs /r:&lt;b&gt;System.Runtime.Serialization.dll&lt;/b&gt;&lt;/pre&gt;
&lt;p&gt;Una vez definidos los tipos personalizados, ahora definimos el nuevo contrato de servicio, y reescribimos su implementación, como se lista a continuación:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Hello.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;
using System.Text;
using System.ServiceModel;
using hello.data;

namespace hello
{
  [ServiceContract(Namespace="http://hello/")]
  interface IHello
  {
    [OperationContract()]
    public &lt;b&gt;HelloCard&lt;/b&gt; SayHello(&lt;b&gt;Person&lt;/b&gt; person);
  }

  [ServiceBehavior(Namespace="http://hello/", Name="HelloService")] 
  public class Hello : IHello
  {
    private StringBuilder message = new StringBuilder("Hola ");
  
    [OperationContract(Namespace="http://hello/")]
    public &lt;b&gt;HelloCard&lt;/b&gt; SayHello(&lt;b&gt;Person&lt;/b&gt; person)
    {      
      if (person == null ||
      person.FirstName == null || 
      person.FirstName.Length == 0)
        throw new FaultException("Objeto Person inválido.");
      &lt;b&gt;message.Append(person.FirstName + "!");
     &lt;/b&gt;string msg = message.ToString();&lt;b&gt;
     HelloCard card = new HelloCard();
     card.Greeting = msg;
     &lt;/b&gt;System.Console.WriteLine(msg);&lt;b&gt;
     return card;&lt;/b&gt;
    }
  }
}&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Nota&lt;/b&gt;: En el código se altera la interfaz del contrato del servicio, cuando en la práctica se debe definir una nueva interfaz e implementarla. Se hizo así para simplicidad del ejemplo.&lt;/p&gt;
&lt;p&gt;Ahora compilamos el servicio agregando la referencia al ensamblado generado previamente:&lt;/p&gt;&lt;pre&gt;&gt;csc /t:library Hello.cs /r:System.ServiceModel.dll,&lt;b&gt;HelloData.dll&lt;/b&gt;&lt;/pre&gt;
&lt;p&gt;El host y su archivo de configuración permanecen sin cambios, por lo que solo resta ejecutar HelloHost.exe. &lt;/p&gt;
&lt;p&gt;Ahora pasamos al cliente. Primero regeneramos los artefactos cliente con svcutil.exe como hasta ahora, y después modificamos el código de la aplicación cliente, tal como se aprecia a continuación:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Client.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;

public class Client
{
  static void Main(string[] args)
  {
    String arg = null;
    String result = null;
    if (args.Length &gt; 0) {
      arg = args[0];
    }
    else {
      arg = "Anónimo";
    }
    try {
      hello.IHello service = new hello.HelloClient();&lt;b&gt;
      hello.data.Person person = new hello.data.Person();
      person.FirstName = arg;
      hello.data.HelloCard card = service.SayHello(person);
      result = card.Greeting;&lt;/b&gt;
    }
    catch (System.ServiceModel.FaultException fault) 
    { 
      result = fault.Message; 
    }
    catch (Exception ex) {
      result = ex.ToString();
    }
    finally{
      System.Console.WriteLine(result);
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Compilamos los archivos del proxy y el cliente, y ejecutamos Client.exe como hasta ahora.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nota&lt;/b&gt;: Además de DataContractSerializer, WCF también admite (de forma excluyente) la clase &lt;b&gt;XmlSerializer&lt;/b&gt;, que es el mismo mecanismo de serialización utilizado en Servicios Web ASP.NET (aka ASMX). Aunque XmlSerializer solo admite un conjunto reducido de tipos, permite un mayor control sobre el XML resultante y admite mejor la norma de XSD. Para más información consulte &lt;a href="http://msdn.microsoft.com/library/ms733901.aspx"&gt;Utilización de XMLSerializer&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=483623" width="1" height="1"&gt;</description></item><item><title>WCF bajo contrato (1/4)</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/07/02/483355.aspx</link><pubDate>Wed, 02 Jul 2008 21:01:18 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:483355</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/483355.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=483355</wfw:commentRss><description>&lt;p&gt;Como continuación al artículo &lt;a href="https://willyxoft.wordpress.com/articulos/servicios-web-wcf/"&gt;Servicios Web con WCF: Una sencilla introducción a Servicios Web con WCF&lt;/a&gt;, la presente serie abordará de manera sencilla los principales tipos de contratos que se emplean para definir los Servicios de WCF. La finalidad es dar una introducción práctica a los mismos, sin pretender ser exhaustivo. Así que partiendo del servicio Hello del artículo anterior, comencemos por el &lt;em&gt;Contrato de Servicio&lt;/em&gt;.&lt;/p&gt; &lt;h3&gt;&lt;a name="contrato-servicio"&gt;Contrato de Servicio&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Un contrato de servicio permite la comunicación con el mismo, al proporcionar la siguiente información:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Listado de las operaciones que ofrece y la ubicación de las mismas  &lt;li&gt;Firma de las operaciones, en términos de intercambio de mensajes  &lt;li&gt;Tipos de datos empleados en los mensajes.  &lt;li&gt;Protocolos concretos y formatos de serialización.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Para esto se utilizan los documentos WSDL y XSD, que son lenguajes estándar para describir servicios web. No obstante WSDL y XSD son difíciles de utilizar, por ello las aplicaciones WCF utilizan atributos, interfaces y clases para definir la estructura de un servicio e implementar un servicio.&lt;/p&gt; &lt;p&gt;En el artículo anterior se define el contrato del servicio utilizando la clase de implementación del mismo. Sin embargo es recomendable utilizar una interfaz para ello, ya que, al igual que un contrato de servicios, las interfaces solo definen la agrupación de métodos (operaciones) con ciertas firmas sin especificar ningún detalle sobre su implementación. Además, todas las ventajas de las interfaces administradas se aplican a las interfaces de contrato de servicio: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Las interfaces pueden extender cualquier número de interfaces.  &lt;li&gt;Una única clase puede implementar cualquier número de interfaces.  &lt;li&gt;Puede modificar la implementación de una interfaz, mientras la interfaz siga siendo la misma.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Por lo que adicionalmente se puede controlar la versión del servicio implementando la interfaz antigua y la nueva. Los clientes antiguos se conectan a la versión original, mientras los clientes más nuevos pueden conectarse a la versión más nueva.&lt;/p&gt; &lt;p&gt;Así que, tras realizar &lt;i&gt;refactoring&lt;/i&gt; al Servicio WCF Hello, el contrato y su implementación ahora quedan de la siguiente forma:&lt;/p&gt; &lt;p&gt;&lt;b&gt;Listado de Hello.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;
using System.Text;
using System.ServiceModel;

namespace hello
{  

  [&lt;b&gt;ServiceContract&lt;/b&gt;(Namespace="http://hello/")]
  interface IHello
  {
    [&lt;b&gt;OperationContract&lt;/b&gt;()]
    &lt;b&gt;string SayHello(string name);&lt;/b&gt;
  }
    
  [&lt;b&gt;ServiceBehavior&lt;/b&gt;(Namespace="http://hello/", Name="HelloService")]    
  public class Hello : &lt;b&gt;IHello&lt;/b&gt;
  {
    private StringBuilder message = new StringBuilder("Hola ");

    public string SayHello(string name)
    {
      &lt;font color="#808000"&gt;if (name == null || name.Length == 0)
        throw new FaultException("Parámetro 'name' nulo o vacío.");&lt;/font&gt;
      string msg = message.Append(name + "!").ToString();
      System.Console.WriteLine(msg);
      return msg;
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Observe que ahora los atributos ServiceContract y OperationContract se aplican a la interfaz, y que a la clase de implementación sólo se la aplica el atributo ServiceBehavior. Recuerde que los dos primeros atributos definen el contrato del servicio y sus operaciones, mientras que el tercero define comportamientos concretos de la implementación. En el ejemplo los utilizamos para marcar las responsabilidades de cada una, así como el namespace a utilizar en la exportación hacia el WSDL.&lt;/p&gt;
&lt;p&gt;Tras compilar el servicio:&lt;/p&gt;&lt;pre&gt;&amp;gt;csc /t:library Hello.cs /r:System.ServiceModel.dll&lt;/pre&gt;
&lt;p&gt;Continuamos con el host. El código de HelloHost.cs permanece sin cambios, pero tenemos que hacer un ligero cambio al archivo de configuración HelloHost.exe.config, de modo ahora el atributo &lt;em&gt;contract&lt;/em&gt; del endpoint señale a la interfaz:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de HelloHost.exe.config&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;system.serviceModel&amp;gt;
    &amp;lt;services&amp;gt;
      &amp;lt;service name="hello.Hello" behaviorConfiguration="enableMetadata"&amp;gt;
        &amp;lt;endpoint &lt;b&gt;contract="hello.IHello"&lt;/b&gt; binding="basicHttpBinding" address="" 
            bindingNamespace="http://hello/" name="HelloPort" /&amp;gt;
        &amp;lt;endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /&amp;gt;
      &amp;lt;/service&amp;gt;
    &amp;lt;/services&amp;gt;
    &amp;lt;behaviors&amp;gt;
      &amp;lt;serviceBehaviors&amp;gt;
        &amp;lt;behavior name="enableMetadata" &amp;gt;
          &amp;lt;serviceMetadata httpGetEnabled="true" /&amp;gt;
        &amp;lt;/behavior&amp;gt;
      &amp;lt;/serviceBehaviors&amp;gt;
    &amp;lt;/behaviors&amp;gt;
  &amp;lt;/system.serviceModel&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;Tras ejecutar el host:&lt;/p&gt;&lt;pre&gt;&amp;gt;HelloHost.exe

El Servicio Web Hello se esta ejecutando...
WSDL: http://localhost:8080/Hello?wsdl
Presione una tecla para cerrarlo.&lt;/pre&gt;
&lt;p&gt;Ahora vamos con el cliente. Primero debemos regenerar los artefactos cliente con svcutil:&lt;/p&gt;&lt;pre&gt;&amp;gt;svcutil http://localhost:8080/hello?wsdl /out:Hello.cs /config:Client.exe.config /n:http://hello/,hello&lt;/pre&gt;
&lt;p&gt;Después modificamos una línea del código de la aplicación cliente:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Client.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;

public class Client
{
  static void Main(string[] args)
  {
    String arg = null;
    String result = null;
    if (args.Length &amp;gt; 0) {
      arg = args[0];
    }
    else {
      arg = "Anónimo";
    }
    try {      
      &lt;b&gt;hello.IHello service = new hello.HelloClient();&lt;/b&gt;
      result = service.SayHello(arg);
    }
    &lt;font color="#808000"&gt;catch (System.ServiceModel.FaultException fault) 
    { 
      result = fault.Message; 
    }&lt;/font&gt;
    catch (Exception ex) {
      result = ex.ToString();
    }
    finally{
      System.Console.WriteLine(result);
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Compilamos tanto el proxy como la aplicación:&lt;/p&gt;&lt;pre&gt;&amp;gt;csc /t:library Hello.cs /r:System.ServiceModel.dll

&amp;gt;csc /t:exe Client.cs /r:System.ServiceModel.dll,Hello.dll&lt;/pre&gt;
&lt;p&gt;Y la ejecución será la misma que la última vez:&lt;/p&gt;&lt;pre&gt;&amp;gt;Client Willy

Hola Willy.&lt;/pre&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=483355" width="1" height="1"&gt;</description></item><item><title>Creando clientes para el Servicio WCF</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/06/21/479594.aspx</link><pubDate>Sat, 21 Jun 2008 13:01:51 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:479594</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/479594.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=479594</wfw:commentRss><description>&lt;h3&gt;Creando un sencillo Cliente WCF&lt;/h3&gt;  &lt;p&gt;Como continuación de: &lt;em&gt;&lt;a href="http://www.dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/06/21/479593.aspx"&gt;Creando un sencillo Servicio Web WCF&lt;/a&gt;&lt;/em&gt;, crearemos &amp;mdash;en un directorio/proyecto distinto&amp;mdash; el cliente para nuestro Servicio Web el cual debe estar publicado y en ejecución.&lt;/p&gt; &lt;p&gt;Pero primero necesitamos generar los &lt;em&gt;artefactos cliente&lt;/em&gt;. Para ello utilizaremos la herramienta &lt;strong&gt;svcutil&lt;/strong&gt; (Herramienta de utilidad de metadatos de ServiceModel) incluida en el Windows SDK for .NET Framework 3.x, a la cual le pasamos como argumento la ubicación del documento WSDL:&lt;/p&gt; &lt;pre&gt;&amp;gt;svcutil http://localhost:8080/hello?wsdl /out:Hello.cs /config:Client.exe.config /n:http://hello/,hello&lt;/pre&gt;
&lt;p&gt;Esto generará un archivo con la clases proxy las cuales encapsularán la invocación de las operaciones del Servicios Web. En nuestro caso se generará el archivo &lt;b&gt;Hello.cs&lt;/b&gt; (con la clase HelloClient que utilizaremos directamente en la aplicación cliente) así como el archivo de configuración &lt;b&gt;Client.exe.config&lt;/b&gt;, de modo que coincida con el nombre del ejecutable de la aplicación cliente.&lt;/p&gt;
&lt;p&gt;Una vez generados los &lt;em&gt;artefactos cliente (proxy)&lt;/em&gt; solo resta crear la aplicación cliente en sí, nuevamente una simple aplicación de consola:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Client.cs&lt;/b&gt;&lt;/p&gt;
&lt;pre&gt;using System;

public class Client
{
  static void Main(string[] args)
  {
    string arg = null;
    string result = null;
    if (args.Length &amp;gt; 0) {
      arg = args[0];
    }
    else {
      arg = "Anónimo";
    }
    try {
      &lt;b&gt;hello.HelloClient service = new hello.HelloClient();&lt;/b&gt; 
      result = &lt;b&gt;service.SayHello(arg);&lt;/b&gt;
    }
    &lt;font color="#808000"&gt;catch (System.ServiceModel.FaultException fault) 
    { 
      result = fault.Message; 
    }&lt;/font&gt;
    catch (Exception ex) {
      result = ex.ToString();
    }
    finally{
      System.Console.WriteLine(result);
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Nótese que para invocar la operación de nuestro Servicio Web primero creamos una instancia de la clase HelloClient (generada por svcutil) por medio de la cual después invocamos al método SayHello &amp;mdash;y tras del cual se invoca la operación del Servicio Web, el cual a su vez invoca el método correspondiente de la clase Hello implementada al inicio del artículo...&lt;/p&gt;
&lt;p&gt;Solo resta compilar tanto el proxy como la aplicación cliente:&lt;/p&gt;
&lt;pre&gt;&amp;gt;csc /t:library Hello.cs

&amp;gt;csc /t:exe Client.cs /r:Hello.dll&lt;/pre&gt;
&lt;p&gt;Después ejecute la aplicación cliente con algún argumento, su nombre por ejemplo, si no se especifica argumento alguno la salida será "Hola Anónimo":&lt;/p&gt;
&lt;pre&gt;&amp;gt;Client Willy

Hola Willy!&lt;/pre&gt;
&lt;p&gt;La misma salida se desplegará en la consola del servicio.&lt;/p&gt;
&lt;br /&gt;
&lt;h3&gt;Creando un sencillo Cliente Java&lt;/h3&gt;
&lt;p&gt;Como ejercicio final crearemos un cliente Java (utilizando JAX-WS) para el Servicio Web, el cual es prácticamente el mismo cliente del artículo &lt;a title="Servicios Web con Java SE&amp;nbsp;6.0" href="http://willyxoft.wordpress.com/articulos/servicios_web_java_se/"&gt;Servicios Web con Java SE&amp;nbsp;6.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Primero necesitamos generar los &lt;em&gt;artefactos cliente&lt;/em&gt;. Para ello utilizaremos la herramienta &lt;strong&gt;wsimport&lt;/strong&gt; incluida en Java SE 6.0, a la cual le pasamos como argumento la ubicación del documento WSDL:&lt;/p&gt;
&lt;pre&gt;&amp;gt;wsimport http://localhost:8080/hello?wsdl&lt;/pre&gt;
&lt;p&gt;Una vez generados los &lt;em&gt;artefactos cliente&lt;/em&gt; solo resta crear el cliente en sí, nuevamente una simple aplicación de consola:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Client.java&lt;/b&gt;&lt;/p&gt;
&lt;pre&gt;public class Client {
  public static void main(String[] args) {
    String arg = null;
    String result = null;
    if (args.length &amp;gt; 0) {
      arg = args[0];
    }
    else {
      arg = "Anonimo";
    }
    try {
      &lt;b&gt;hello.HelloService service = new hello.HelloService();&lt;/b&gt;
      &lt;b&gt;hello.Hello port = service.getHelloPort();&lt;/b&gt;
      result = &lt;b&gt;port.sayHello(arg);&lt;/b&gt;
    }
    catch (Exception ex) {
      result = ex.toString();
    }
    finally{
      System.out.println(result);
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Tal como puede apreciarse, la razón para nombrar al servicio como &lt;i&gt;HelloService&lt;/i&gt; y su endpoint como &lt;i&gt;HelloPort&lt;/i&gt; fue para que coincidiera con el Servicio Web elaborado en Java en el artículo anteriorermte citado y así se pudiese reutilizar el código del cliente. No obstante de no haberlo hecho el código del cliente cambiaría en algo como:&lt;/p&gt;
&lt;pre&gt;hello.&lt;b&gt;Hello_Service&lt;/b&gt; service = new hello.&lt;b&gt;Hello_Service&lt;/b&gt;();&lt;span&gt;
&lt;/span&gt;hello.Hello port = service.&lt;b&gt;getBasicHttpBindingHello&lt;/b&gt;();&lt;/pre&gt;
&lt;p&gt;Finalmente compilamos y ejecutamos nuestro cliente con algún argumento:&lt;/p&gt;
&lt;pre&gt;&amp;gt;javac Client.java&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&amp;gt;java Client Java

Hola Java!&lt;/pre&gt;
&lt;p&gt;La misma salida se desplegará en la consola del servicio.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Fuente: &lt;a href="http://willyxoft.wordpress.com/articulos/servicios-web-wcf/"&gt;Servicios Web con WCF&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=479594" width="1" height="1"&gt;</description></item><item><title>Creando un sencillo Servicio Web WCF</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/06/21/479593.aspx</link><pubDate>Sat, 21 Jun 2008 12:03:31 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:479593</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>1</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/479593.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=479593</wfw:commentRss><description>&lt;p&gt;Para ilustrar la creación de Servicio con WCF emplearemos el clásico ejemplo de Hola Mundo, el cual luce así:&lt;/p&gt; &lt;p&gt;&lt;b&gt;Listado de Hello.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;
using System.Text;
&lt;b&gt;using System.ServiceModel;&lt;/b&gt;

namespace hello
{&lt;b&gt;
&lt;/b&gt;  &lt;b&gt;[ServiceContract&lt;/b&gt;(Namespace="http://hello/")&lt;b&gt;]
&lt;/b&gt;  [ServiceBehavior(Namespace="http://hello/", Name="HelloService")]
  public class Hello
  {
    private StringBuilder message = new StringBuilder("Hola ");

    &lt;b&gt;[OperationContract]&lt;/b&gt;
    public string SayHello(string name)
    {
      &lt;font color="olive"&gt;if (name == null || name.Length == 0)
        throw new &lt;strong&gt;FaultException&lt;/strong&gt;("El parámetro 'name' es nulo o vacío.");&lt;/font&gt;
      string msg = message.Append(name + "!").ToString();
      System.Console.WriteLine(msg);
      return msg;
    }
  }
}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; La parte del código en color oliva puede omitirse para simplicidad del ejemplo, no obstante sirve de introducción al tema de excepciones en servicios web.&lt;/p&gt;
&lt;p&gt;Nótese que luce como una clase normal pero con algunas adiciones: En primer lugar declaramos la utilización del namespace &lt;b&gt;System.ServiceModel&lt;/b&gt; dentro del cual se encuentran las clases atributo con las cuales marcamos la clase Hello como el contrato del servicio (atributo &lt;b&gt;ServiceContract&lt;/b&gt;) y al método SayHellocomo una operación del mismo (atributo &lt;b&gt;OperationContract&lt;/b&gt;). Con esto habilitamos la clase para que pueda ser consumida como un Servicio WCF el cual posteriormente publicaremos como un Servicio Web. Finalmente el atributo &lt;b&gt;ServiceBehavior&lt;/b&gt; especifica el comportamiento de ejecución de una implementación del contrato de servicio, es éste caso sólo lo empleamos para especificar lo que será el "targetNamespace" y "name" del servicio para la exportación de la definición del mismo a través de WSDL.&lt;/p&gt;
&lt;p&gt;Solo resta compilar la clase, asegurándonos de referenciar al ensamblado System.ServiceModel.dll:&lt;/p&gt;&lt;pre&gt;&amp;gt;csc /t:library Hello.cs /r:System.ServiceModel.dll&lt;/pre&gt;
&lt;p&gt;Con lo anterior ya tenemos un sencillo Servicio WCF casi listo para ser alojado y desplegado como un Servicio Web dentro de un Sitio Web ASP.NET, no obstante podemos probarlo sin necesidad de recurrir a IIS (o Cassini) si creamos un &lt;i&gt;Endpoint&lt;/i&gt; dentro de una aplicación de consola que actuará como host del servicio, tal como se ilustra en el siguiente código:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; Para revisar otras opciones de "alojamiento" de servicios WCF consultar: &lt;a href="http://msdn.microsoft.com/library/ms730158.aspx"&gt;Alojando Servicios&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de HelloHost.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;
&lt;b&gt;using System.ServiceModel;&lt;/b&gt;

class HelloHost
{
  static void Main(string[] args)
  {
    string endpointAddress = "http://localhost:8080/hello";
    &lt;b&gt;ServiceHost myServiceHost = 
&lt;/b&gt;      &lt;b&gt;new ServiceHost(typeof(hello.Hello), new Uri(endpointAddress));&lt;/b&gt;
    &lt;b&gt;myServiceHost.Open();&lt;/b&gt;
    System.Console.WriteLine("El Servicio Web Hello se está ejecutando...");
    System.Console.WriteLine("WSDL: " + endpointAddress + "?wsdl");
    System.Console.WriteLine("Presione una tecla para cerrarlo.");
    System.Console.ReadKey();
    if (myServiceHost.State != CommunicationState.Closed)
      &lt;b&gt;myServiceHost.Close();&lt;/b&gt;
  }
}&lt;/pre&gt;
&lt;p&gt;Nótese que se trata de una simple aplicación de consola que utiliza una instancia de la clase &lt;b&gt;ServiceHost&lt;/b&gt; para crear un &lt;i&gt;endpoint&lt;/i&gt; para un servicio de tipo HelloService.Hello en la dirección (Address) http://localhost:8080/Hello. Esto último gracias a que la clase ServiceHost utiliza la información proporcionada tanto en el código como en el archivo de configuración —que veremos a continuación— para crear y publicar un &lt;b&gt;ServiceEndpoint&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Por lo que el siguiente paso es crear el archivo de configuración (que se vinculará al ejecutable de HelloHost) con el siguiente contenido:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de HelloHost.exe.config&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="&lt;b&gt;utf-8&lt;/b&gt;" ?&amp;gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;system.serviceModel&amp;gt;
    &amp;lt;services&amp;gt;
      &amp;lt;service &lt;b&gt;name="hello.Hello"&lt;/b&gt; &lt;font color="#808000"&gt;behaviorConfiguration="enableMetadata"&lt;/font&gt;&amp;gt;
        &amp;lt;endpoint &lt;b&gt;contract="hello.Hello"&lt;/b&gt; &lt;b&gt;binding="basicHttpBinding"&lt;/b&gt; 
                bindingNamespace="http://hello/" name="HelloPort" /&amp;gt;
        &lt;font color="#808000"&gt;&amp;lt;endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /&amp;gt;&lt;/font&gt;
      &amp;lt;/service&amp;gt;
    &amp;lt;/services&amp;gt;
&lt;font color="#808000"&gt;    &amp;lt;behaviors&amp;gt;
      &amp;lt;serviceBehaviors&amp;gt;
        &amp;lt;behavior name="enableMetadata" &amp;gt;
          &amp;lt;serviceMetadata httpGetEnabled="true" /&amp;gt;
        &amp;lt;/behavior&amp;gt;
      &amp;lt;/serviceBehaviors&amp;gt;
    &amp;lt;/behaviors&amp;gt;&lt;/font&gt;
  &amp;lt;/system.serviceModel&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;Observe que en éste caso la clase &lt;b&gt;hello.Hello&lt;/b&gt; sirve tanto para definir la clase de implementación del servicio como su contrato, es por ello que aparece tanto en el atributo &lt;i&gt;name&lt;/i&gt; del elemento &lt;i&gt;service&lt;/i&gt;, como en el atributo &lt;i&gt;contract&lt;/i&gt; del elemento &lt;i&gt;endpoint&lt;/i&gt;. En un artículo posterior veremos que esto se puede realizar de forma separada utilizando una interfaz como contrato.&lt;/p&gt;
&lt;p&gt;Lo siguiente a destacar es la línea:&lt;/p&gt;&lt;pre&gt;&amp;lt;endpoint contract="hello.Hello" binding="basicHttpBinding" ... /&amp;gt;&lt;/pre&gt;
&lt;p&gt;En la cual se especifica tanto la clase/interfaz que define al servicio (Contract), así como la forma de enlace (Binding) con el &lt;em&gt;endpoint&lt;/em&gt;, cuya ubicación en la red (Address) se definió en el código de HelloHost. Estos tres elementos: &lt;b&gt;A&lt;/b&gt;ddress, &lt;b&gt;B&lt;/b&gt;inding &amp;amp; &lt;b&gt;C&lt;/b&gt;ontract, constituyen el ABC de los Endpoints de WCF. Para más información al respecto consultar: &lt;a href="http://msdn.microsoft.com/library/ms733107.aspx"&gt;Endpoints: Address, Bindings and Contracts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El enlace de tipo &lt;strong&gt;basicHttpBinding&lt;/strong&gt; representa la forma de enlace que el servicio WCF utiliza para configurar y exponer su correspondiente &lt;em&gt;endpoint&lt;/em&gt; de modo que el servicio pueda comunicarse como un Servicio Web (basado en ASMX) que cumple con el WS-I Basic Profile 1.1.&lt;/p&gt;
&lt;p&gt;Los atributos del endpoint &lt;i&gt;bindingNamespace&lt;/i&gt; y &lt;i&gt;name&lt;/i&gt; sirven para especificar el "targetNamespace" y "name" del enlace para la definición a través de WSDL.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nota&lt;/b&gt;: El resto de la configuración (de color &lt;font color="#808000"&gt;oliva&lt;/font&gt;) sirve para habilitar la exposición de los Metadatos del servicio, de modo que se pueda tener acceso al WSDL generado bajo demanda. No es necesaria para poder consumir el servicio, por lo que si se facilita el WSDL por otra vía bien podría omitirse dicha configuración extra.&lt;/p&gt;
&lt;p&gt;Una vez elaborado el archivo de configuración solo resta compilar y ejecutar HelloHost, el cual mostrará unas líneas indicando que el servicio se está ejecutando, así como la ubicación del documento WSDL del mismo para cualquier cliente que desee consumirlo.&lt;/p&gt;&lt;pre&gt;&amp;gt;csc /t:exe HelloHost.cs /r:System.ServiceModel.dll,Hello.dll&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&amp;gt;HelloHost.exe

El Servicio Web Hello se esta ejecutando...
WSDL: http://localhost:8080/hello?wsdl
Presione una tecla para cerrarlo.&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Nota&lt;/b&gt;: Se requiere de una cuenta con privilegios de Administrador para ejecutar el host, o bien para modificar los derechos de la reserva para una parte del espacio de nombres HTTP. Para más información consulte: &lt;a href="http://go.microsoft.com/fwlink/?linkid="&gt;Configuración de los elementos de enlace de transporte HTTP y HTTPS para WCF&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Lo siguiente a realizar, es crear un cliente que lo consuma...&lt;/p&gt;&lt;br&gt;
&lt;p&gt;Fuente: &lt;a href="http://willyxoft.wordpress.com/articulos/servicios-web-wcf/"&gt;Servicios Web con WCF&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=479593" width="1" height="1"&gt;</description></item><item><title>SQL Server 2008 RC</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/06/12/476803.aspx</link><pubDate>Fri, 13 Jun 2008 02:00:15 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:476803</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/476803.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=476803</wfw:commentRss><description>&lt;p&gt;&lt;em&gt;A comenzado la saga RC de SQL Server 2008, el RTM se acerca...&lt;/em&gt; &lt;/p&gt; &lt;p&gt;&lt;b&gt;SQL Server 2008 Express RC0:&lt;/b&gt; edición funcional ideal para aprender y ejecutar aplicaciones de base de datos de escritorio y de servidor a pequeña escala. SQL Server 2008 Express admite 1 CPU, 1 GB de RAM y bases de datos de hasta 4 GB.  &lt;ul&gt; &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=118953&amp;amp;clcid=0x0c0a"&gt;SQL Server Express 2008 x86&lt;/a&gt;  &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=118954&amp;amp;clcid=0x0c0a"&gt;SQL Server Express 2008 x64&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Ejecute el archivo de descarga para copiar los archivos de instalación en el directorio Temp. La instalación comenzará una vez se haya completado la extracción. No es necesario buscar e iniciar setup.exe manualmente.&lt;/p&gt; &lt;p&gt;&lt;b&gt;SQL Server 2008 Express Advanced RC0:&lt;/b&gt; edición Express que además incluye una plataforma básica de informes y administración de datos con funcionalidad completa.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=118955&amp;amp;clcid=0x0c0a"&gt;SQL Server Express Advanced 2008 x86&lt;/a&gt;  &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=118956&amp;amp;clcid=0x0c0a"&gt;SQL Server Express Advanced 2008 x64&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Tanto el formato de archivo de descarga como el inicio del proceso de instalación son idénticos para SQL Express.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;SQL Server 2008 RC0&lt;/strong&gt;: versión de prueba para crear y probar cualquier tipo de aplicación. Incluye toda la funcionalidad de SQL Server 2008 Enterprise, pero sólo está autorizado para el uso de desarrollo, prueba y demostración.  &lt;ul&gt; &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=118952&amp;amp;clcid=0x0c0a"&gt;SQL Server 2008 x86&lt;/a&gt;  &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=118950&amp;amp;clcid=0x0c0a"&gt;SQL Server 2008 x64&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Ejecute el archivo de descarga. En el símbolo del sistema, seleccione un directorio y pulse &lt;b&gt;Siguiente&lt;/b&gt;. Una vez finalizado el paso de extracción automática, busque y haga doble clic en Setup.exe en el directorio seleccionado para comenzar la instalación.  &lt;p&gt;Además de SQL Server Evaluation, puede probar las ediciones Standard y Enterprise, para ello especifique la clave del producto correspondiente para desbloquear la edición que desea.  &lt;p&gt;&lt;strong&gt;Más información en: &lt;/strong&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=35f53843-03f7-4ed5-8142-24a4c024ca05&amp;amp;DisplayLang=es"&gt;&lt;strong&gt;SQL Server 2008 Release Candidate 0&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=476803" width="1" height="1"&gt;</description></item><item><title>Silverlight 2 Beta 2</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/06/07/474685.aspx</link><pubDate>Sat, 07 Jun 2008 22:00:32 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:474685</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/474685.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=474685</wfw:commentRss><description>&lt;p&gt;&lt;img src="http://www.aecomo.org/images/microsoft-silverlight.jpg" align="right"&gt;Microsoft ha liberado la segunda beta pública de Silverlight 2.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;¿Que es Silverlight?&lt;/p&gt; &lt;p&gt;Silverlight (antes WPF/E) es una nueva tecnología de presentación Web propuesta por Microsoft, creada para su ejecución en distintos browser HTTP y en múltiples dispositivos y sistemas operativos de escritorio. Al igual que WPF (Windows Presentation Foundation), la tecnología de presentación en Microsoft .NET Framework 3.0: XAML (eXtensible Application Markup Language), constituye la base de la capacidad de presentación de Silverlight.  &lt;p&gt;Parafraseado de &lt;a href="http://www.microsoft.com/spanish/msdn/articulos/archivo/010507/voices/bb404300.mspx"&gt;Introducción a Silverlight&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Algunas características de Siverlight 2 Beta 2:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Soporte de lenguajes .NET: VB.NET, C#, Iron Python e IronRuby  &lt;li&gt;Nuevo conjunto de controles (Button, ListBox, Slider, CheckBox, DataGrid, Calendar, TabPanel, etc.)  &lt;li&gt;Edición de plantilla de controles  &lt;li&gt;VSM (Visual State Manager)  &lt;li&gt;Caching cliente  &lt;li&gt;Soporte para WCF  &lt;li&gt;Programación XML  &lt;li&gt;LINQ to XML y LINQ to Objects  &lt;li&gt;ADO.NET Data Services  &lt;li&gt;&lt;a href="http://labs.live.com/Silverlight+2+Deep+Zoom.aspx"&gt;Tecnología Deep Zoom&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Descargas:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.microsoft.com/silverlight/resources/install.aspx?v=2.0"&gt;Silverlight 2 Beta 2 plug-in (runtime)&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ba7b510d-0646-4d06-9834-cb82d669872a&amp;amp;DisplayLang=en"&gt;Silverlight 2 Beta 2 SDK&lt;/a&gt;  &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=120319"&gt;Silverlight 2 Beta 2 Tools for Visual Studio 2008&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Mayor información:  &lt;ul&gt; &lt;li&gt;&lt;a href="http://silverlight.net/GetStarted/overview.aspx"&gt;Silverlight Overview&lt;/a&gt;  &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/06/06/silverlight-2-beta2-released.aspx"&gt;Silverlight 2 Beta2 Released&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=474685" width="1" height="1"&gt;</description></item><item><title>Gu&amp;#237;a de Seguridad WCF (Beta)</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/06/07/474684.aspx</link><pubDate>Sat, 07 Jun 2008 21:35:04 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:474684</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/474684.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=474684</wfw:commentRss><description>&lt;img src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=WCFSecurityGuide&amp;amp;DownloadId=35620" align="right"&gt;  &lt;p&gt;El equipo de patterns &amp;amp; practices ha publicado la versión beta de su guía de seguridad en Servicios Web titulada: &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Improving Web Services Security: Scenarios and Implementation Guidance for WCF&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;En la cual se muestra cómo mejorar la seguridad de WCF mediante escenarios, guías directivas, Preguntas &amp;amp; Respuestas, listados Como-Se-Hace, etc... La guía está relacionada con el proyecto de seguridad: &lt;a href="http://www.codeplex.com/WCFSecurity"&gt;WCF Security Guidance Project&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Mayor información y descarga de la guía en:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.codeplex.com/WCFSecurityGuide" href="http://www.codeplex.com/WCFSecurityGuide"&gt;WCF Web Services Security Guide&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=474684" width="1" height="1"&gt;</description></item><item><title>Velocidad de datos</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/06/07/474683.aspx</link><pubDate>Sat, 07 Jun 2008 21:30:22 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:474683</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/474683.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=474683</wfw:commentRss><description>&lt;p&gt;El equipo de Datos de Microsoft se encuentra trabajando en un proyecto de caching llamado "Velocity" del cual ya ha publicado el primer CTP. Pretenden que el producto resultante del proyecto sea una plataforma de caché en memoria que proporcione a las aplicaciones .NET el acceso a datos a alta velocidad, de forma escalable y con alta disponibilidad. &lt;/p&gt; &lt;p&gt;&lt;img height="310" src="http://msdn.microsoft.com/es-mx/library/cc645013.image002.jpg" width="583"&gt;&lt;/p&gt; &lt;p&gt;Principales características:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Almacenamiento de cualquier objeto CLR serializable y acceso mediante APIs simples  &lt;li&gt;Caché de alto desempeño para todas la aplicaciones de datos  &lt;li&gt;Ejecución tanto como servicio de red como embebido en aplicaciones  &lt;li&gt;Soporte para las configuraciones más comunes de caché  &lt;li&gt;Escalamiento dinámico  &lt;li&gt;Balanceo de carga automático  &lt;li&gt;Compatibilidad con ASP.NET e IIS.  &lt;li&gt;Alta disponibilidad al mantener copias de datos en múltiples nodos  &lt;li&gt;Soporte de múltiples lenguajes del lado cliente (PHP, C#, C++, etc.)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Para mayor información visitar:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/data/cc655792.aspx"&gt;Microsoft Project Code Named “Velocity”&lt;/a&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/velocity/archive/2008/06/04/project-velocity-ctp1-features.aspx"&gt;Project Velocity CTP1 Features&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=474683" width="1" height="1"&gt;</description></item><item><title>Liberados EntLib 4.0 y Unity AB 1.1</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/05/16/469387.aspx</link><pubDate>Sat, 17 May 2008 00:00:56 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:469387</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/469387.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=469387</wfw:commentRss><description>&lt;p&gt;El grupo de &lt;a href="http://msdn.microsoft.com/en-us/practices/default.aspx"&gt;patterns &amp;amp; practices&lt;/a&gt; de Microsoft acaba de liberar la versi&amp;#243;n final de Enterprise Library 4.0 ( Mayo 2008 ) el cual, adem&amp;#225;s de la integraci&amp;#243;n con VS2008 y algunas mejoras de los Application Block existentes en la versi&amp;#243;n previa, incorpora el nuevo Unity Application Block. Unity tambi&amp;#233;n puede descargarse de forma independiente del EntLib4 y utilizarse tanto con VS2005 como con VS2008 -a diferencia del EntLib4 que s&amp;#243;lo funciona con VS2008.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;#191;Que es Enterprise Library?&lt;/p&gt;    &lt;p&gt;Es una colecci&amp;#243;n de componentes de software reutilizables (llamados &amp;quot;Applicaction Block&amp;quot;) y gu&amp;#237;as de buenas pr&amp;#225;cticas, dise&amp;#241;ados para asistir a los desarrolladores en los retos m&amp;#225;s comunes del desarrollo empresarial. Los AB son configurables (mediante archivos de configuraci&amp;#243;n .config) y pueden funcionar de forma independiente o colaborando entre s&amp;#237;.&lt;/p&gt;    &lt;p&gt;&amp;#191;Que es Unity Application Block?&lt;/p&gt;    &lt;p&gt;Es un Contenedor de Inyecci&amp;#243;n de Dependencias ligero y extensible, el cual facilita la construcci&amp;#243;n de aplicaciones d&amp;#233;bilmente acopladas y proporciona a los desarrolladores las siguientes ventajas:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;Simplifica la creaci&amp;#243;n de objetos, especialmente con dependencias y estructuras jer&amp;#225;rquicas. &lt;/li&gt;      &lt;li&gt;Especificaci&amp;#243;n de las dependencias en tiempo de ejecuci&amp;#243;n o v&amp;#237;a configuraci&amp;#243;n. &lt;/li&gt;      &lt;li&gt;Aplazamiento de la configuraci&amp;#243;n de componentes en el contenedor. &lt;/li&gt;      &lt;li&gt;Capacidad de localizaci&amp;#243;n de servicios. &lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;Mayor informaci&amp;#243;n y descarga en:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc512464.aspx"&gt;Enterprise Library 4.0&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=90DE37E0-7B42-4044-99BE-F8ECFBBC5B65&amp;amp;displaylang=en"&gt;Download Enterprise Library 4.0&lt;/a&gt; (incluye Unity AB) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc468366.aspx"&gt;Unity Application Block 1.1&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=6a9e363c-8e0a-48d3-bbe4-c2f36423e2df&amp;amp;DisplayLang=en"&gt;Download Unity Application Block 1.1&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=469387" width="1" height="1"&gt;</description></item><item><title>Heroes {On-Line}</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/04/28/466429.aspx</link><pubDate>Mon, 28 Apr 2008 05:00:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:466429</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/466429.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=466429</wfw:commentRss><description>&lt;p&gt;&lt;img alt="" src="http://www.microsoft.com/latam/lanzamientoedicionespecial2008/images/render2.jpg" align="right" border="0" /&gt;El día de mañana&amp;nbsp;Microsoft Latinoamérica llevará a cabo el evento On-Line&amp;nbsp;&lt;strong&gt;Microsoft Technet &amp;amp; MSDN Briefing&lt;/strong&gt;, Edición Especial de&amp;nbsp;&lt;font color="#ff0000"&gt;{Lanzamiento}&lt;/font&gt; de los productos:&amp;nbsp;Windows Server 2008, SQL Server 2008&amp;nbsp;y Visual Studio 2008.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extensibilidad de Visual Studio &lt;/li&gt;
&lt;li&gt;C# 3 y LINQ &lt;/li&gt;
&lt;li&gt;Clientes ricos y conectados &lt;/li&gt;
&lt;li&gt;Desarrollo con Office &lt;/li&gt;
&lt;li&gt;Silverlight 2.0 &lt;/li&gt;
&lt;li&gt;Sindication Integration WCF &amp;amp; WF &lt;/li&gt;
&lt;li&gt;Desarrollo Web &lt;/li&gt;
&lt;li&gt;QA con Team System &lt;/li&gt;
&lt;li&gt;SQL Server 2008 Alta Disponibilidad &lt;/li&gt;
&lt;li&gt;SQL Server 2008 Manageability &lt;/li&gt;
&lt;li&gt;Virtualization Technologies &lt;/li&gt;
&lt;li&gt;Window IT Pros Seguridad &lt;/li&gt;
&lt;li&gt;Windows Server 2008 Overview &lt;/li&gt;
&lt;li&gt;Windows Server and Vista Solid Enterprise &lt;/li&gt;
&lt;li&gt;Windows Server Web&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Registro en el sitio del evento: &lt;br /&gt;&lt;a href="http://www.microsoft.com/latam/lanzamientoedicionespecial2008/"&gt;www.microsoft.com/latam/lanzamientoedicionespecial2008/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=466429" width="1" height="1"&gt;</description></item><item><title>HEROES</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/04/05/460983.aspx</link><pubDate>Sat, 05 Apr 2008 19:00:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:460983</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/460983.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=460983</wfw:commentRss><description>&lt;p&gt;&lt;img alt="Heroes" src="http://willyxoft.files.wordpress.com/2008/04/heroes.jpg" align="right" border="0" /&gt;Como sabrán, el tema de la o&lt;em&gt;la de lanzamientos 2008&lt;/em&gt; de los productos Microsoft: Windows Server, SQL Server y Visual Studio, es el de HEROES &amp;mdash;inspirado en una serie de ficción al estilo de Stan Lee, pero ahora sin trajes...&lt;/p&gt;
&lt;p&gt;En Latinoamérica el tema se ha dirigido hacia los &amp;ldquo;héroes locales&amp;rdquo;, así pues el tema en México es la &amp;ldquo;Lucha Libre&amp;rdquo;, siendo el Hijo del Santo el invitado de honor al evento de lanzamiento, acompañado de un show de Lucha al final del mismo. La cita es el próximo 17 de abril en el WTC de la ciudad de México. Mayor información y registro en: &lt;a href="http://www.microsoft.com/mexico/eventos/lucha/"&gt;HEROES {mexicanos}&lt;/a&gt;.&lt;a href="http://www.microsoft.com/mexico/eventos/lucha/"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Al día siguiente se llevará a cabo un evento similar por parte de la Comunidad Ineta Puebla.NET, en el Tec de Monterrey campus Puebla. No habrá luchadores, mas la agenda del evento lo hace interesante: &lt;a href="http://www.dotnetpuebla.com/eventos/heroes/"&gt;HEROES {Puebla.NET}&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Para finalizar, dejo el vínculo de la página donde se encuentran publicados los manuales para llevar a cabo los laboratorios de los eventos de lanzamiento: &lt;a href="http://heroes.labmanuals.virtualwide.com/"&gt;HEROES happen {here} &amp;ndash; Hand On Labs Manuals&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=460983" width="1" height="1"&gt;</description></item><item><title>Service Factory para VS2008</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/02/29/450184.aspx</link><pubDate>Fri, 29 Feb 2008 21:00:01 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:450184</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/450184.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=450184</wfw:commentRss><description>&lt;p&gt;&lt;strong&gt;El equipo de p&amp;amp;p ha publicado el Service Factory para Visual Studio 2008.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;El &lt;em&gt;Web Service Software Factory: Modeling Edition&lt;/em&gt; (Fábrica de Software para Servicios Web: Edición de Modelado) &amp;mdash;también conocida como &lt;strong&gt;Service Factory&lt;/strong&gt;&amp;mdash; es una colección integrada de recursos diseñada para ayudarnos a construir rápida y consistentemente Servicios Web WCF y ASMX que se adhieren a los bien-conocidos patrones de diseño y arquitectura. Estos recursos consistentes en modelos con generación de código en forma de herramientas que se integran con Visual Studio 2008 y temas sobre patrones y arquitectura en forma de guías directivas.&lt;/p&gt;
&lt;p&gt;Service Factory contiene automatización y directivas integradas dentro de Visual Studio 2008 para la construcción de servicios. El núcleo de los componentes de automatización es un modelo de dominio para Servicios Web. Este modelo de dominio contiene elementos tales como los contratos de servicios, operaciones, mensajes y contratos de datos. Este modelo de dominio se manifiesta en la forma de tres lenguajes de específicos-al-dominio (DSLs) integrados que se utilizan para modelar servicios: Modelo de Contrato de Servicio, Modelo de Contrato de Datos, y el Modelo de Host.&lt;/p&gt;
&lt;p&gt;Además de las facilidades de automatización en Visual Studio, Service Factory también contiene las directrices relevantes sobre la construcción de servicios Web &amp;mdash;mucha de ésta documentación viene del release de Diciembre de 2006. Algunos de éstos temas incluyen arquitectura, diseño de mensajes, versionamiento, manejo de excepciones, y otros patrones útiles. Para ver la lista completa de temas que se incluyen, vea la sección &lt;em&gt;Web Service Architecture&lt;/em&gt; en la documentación incluida con Service Factory.&lt;/p&gt;
&lt;p&gt;Mayor información y descarga:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Para obtener más información sobre Service Factory, por favor, &lt;a href="http://msdn.com/servicefactory"&gt;consulte la página oficial de Service Factory en MSDN&lt;/a&gt;, además de los recursos en el &lt;a href="http://codeplex.com/servicefactory"&gt;sitio de la comunidad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Para descargar la versión binaria, puede utilizar este &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=F7AA544D-AD73-4B65-88D5-63F751844540&amp;amp;displaylang=en"&gt;enlace directo a la descarga del Service Factory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;También puede &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=6C200BAC-9F33-46E3-A5A2-839FD7DC022F&amp;amp;displaylang=en"&gt;descargar el código fuente del Service Factory&lt;/a&gt; desde MSDN&lt;/li&gt;
&lt;li&gt;En el sitio de la comunidad también puede encontrar la &lt;a href="http://www.codeplex.com/servicefactory/Release/ProjectReleases.aspx?ReleaseId=8130"&gt;versión que trabaja con &lt;strong&gt;Visual Studio 2005&lt;/strong&gt;&lt;/a&gt; liberada el año pasado&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=450184" width="1" height="1"&gt;</description></item><item><title>VS 2008 Web-Dev Hot-Fix</title><link>http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/02/09/436722.aspx</link><pubDate>Sun, 10 Feb 2008 04:26:31 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:436722</guid><dc:creator>vbpuntonet</dc:creator><slash:comments>0</slash:comments><comments>http://dotnetjunkies.com/WebLog/vbpuntonet/comments/436722.aspx</comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=436722</wfw:commentRss><description>Microsoft a&amp;nbsp;publicado un parche que corrige algunos problemas&amp;nbsp;reportados en VS 2008 y&amp;nbsp;VS 2008 Developer Express en escenarios Web. 
&lt;p&gt;Descargar disponible en&amp;nbsp;&lt;a href="https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=10826"&gt;connect.microsoft.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Para mayor información sobre&amp;nbsp;el parche, incluyendo la lista de errores que corrige,&amp;nbsp;&amp;nbsp;leer: &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/02/08/vs-2008-web-development-hot-fix-roll-up-available.aspx"&gt;VS 2008 Web Development Hot-Fix Roll-Up Available&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=436722" width="1" height="1"&gt;</description></item></channel></rss>