<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Un Poco de Todo</title><link>http://geeks.ms/blogs/cgonzalez/default.aspx</link><description>Blog de Cristina Gonzalez</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Servicios WCF hospedados en IIS (I)</title><link>http://geeks.ms/blogs/cgonzalez/archive/2009/07/06/servicios-wcf-hospedados-en-iis-i.aspx</link><pubDate>Mon, 06 Jul 2009 18:01:49 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:151877</guid><dc:creator>Cristina González</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/cgonzalez/rsscomments.aspx?PostID=151877</wfw:commentRss><comments>http://geeks.ms/blogs/cgonzalez/archive/2009/07/06/servicios-wcf-hospedados-en-iis-i.aspx#comments</comments><description>&lt;p align="justify"&gt;Hola a todos, mi nombre es Cristina y, a pesar de llevar ya un tiempo en Plain Concepts, hasta ahora no me había animado a postear. Espero que esto cambie a partir de ahora y me veáis cada vez con más frecuencia por aquí :). Mi intención es hablaros de lenguajes de programación, diseño, arquitectura de aplicaciones, WPF, entity framework,... vamos, un poco de todo. &lt;/p&gt;  &lt;p align="justify"&gt;Para ir calentando motores, en este primer post os voy a explicar cómo hospedar un servicio WCF en IIS. Veremos cómo crear y configurar un servicio WCF, cómo hospedarlo en IIS y, en un próximo post, crearemos y configuraremos un cliente que se comunique con nuestro servicio. Ahora… vamos al grano!&lt;/p&gt;  &lt;h3&gt;Creación de una librería WCF&lt;/h3&gt;  &lt;p align="justify"&gt;Para nuestro proyectito de prueba vamos a empezar creando una librería WCF, que contendrá la implementación de los servicios que queremos exponer. Para ello creamos un proyecto nuevo de Visual Studio de tipo WCF Service Library. La plantilla de Visual Studio nos creará un esquema que contiene un ejemplo que nos guiará en la creación de nuestro servicio. Dicha plantilla incluye, por una parte, el fichero IService1.cs, el cual representa el contrato del servicio WFC y contiene una interfaz que se decora con [ServiceContract] y las operaciones a exponer que se decoran con el atributo [OperationContract].&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="02-IService - Copy" border="0" alt="02-IService - Copy" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/cgonzalez/02IServiceCopy_5F00_30E9ADC4.jpg" width="637" height="195" /&gt;&lt;/p&gt;  &lt;p align="justify"&gt;En dicha plantilla también se incluye cómo se deberían tratar los tipos complejos para que se serialicen correctamente a través del servicio. Lo que hay que hacer es decorar la clase con el atributo [DataContract] y los métodos con [DataMember].&lt;/p&gt;  &lt;p align="justify"&gt;Por otra parte, el esquema que genera Visual Studio&amp;#160; también contiene el fichero Service1.cs que implementa la interfaz IService1.cs. Por tanto, es el que va a tener la lógica de nuestro servicio.&lt;/p&gt;  &lt;p align="justify"&gt;Una vez hecho esto, pasaremos a crear una aplicación WCF que utilice nuestra librería y lo configuraremos para hostearlo en IIS.&lt;/p&gt;  &lt;h3&gt;Creación de una aplicación WCF&lt;img style="border-right-width:0px;margin:0px 0px 0px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="06-SolutionExplorer" border="0" alt="06-SolutionExplorer" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/cgonzalez/06SolutionExplorer_5F00_3F54841C.jpg" width="318" height="322" /&gt;&lt;/h3&gt;  &lt;p align="justify"&gt;Añadimos a nuestra solución un nuevo proyecto de tipo WCF Service Application. Como podemos ver en la imagen,&amp;#160; la plantilla de Visual Studio también nos crea el contrato para el servicio en el fichero IService1.cs. Sin embargo, no lo vamos a necesitar puesto que vamos a utilizar el que hemos creado en la librería anterior. Del mismo modo, si desplegamos el elemento asociado a Service1.svc y lo abrimos, podremos comprobar que contiene la implementación asociada al contrato de IService1.cs. Nuevamente, lo que vamos a utilizar es el código del proyecto anterior. Por tanto, eliminamos del proyecto tanto el fichero IService1.cs como el fichero Service1.svc.cs, pero ojo! no Service1.svc.&lt;/p&gt;  &lt;p align="justify"&gt;Dado que nos hemos cargado alegremente las operaciones del servicio predefinidas en el proyecto que contiene la aplicación WCF, lo siguiente que tenemos que hacer es vincular a dicho proyecto la librería con la implementación de los servicios WCF que realmente vamos a utilizar, de modo que añadimos al proyecto la referencia de la librería. A continuación hacemos doble clic sobre Service1.svc.cs y obtenemos la siguiente configuración:&lt;/p&gt;  &lt;p&gt;&amp;lt;%@ ServiceHost Language=&amp;quot;C#&amp;quot; Debug=&amp;quot;true&amp;quot; Service=&amp;quot;WcfServiceApplication.Service1&amp;quot; CodeBehind=&amp;quot;Service1.svc.cs&amp;quot; %&amp;gt;&lt;/p&gt;  &lt;p&gt;Deberemos modificarlo indicando la localización del servicio en nuestra librería:&lt;/p&gt;  &lt;p&gt;&amp;lt;%@ ServiceHost Language=&amp;quot;C#&amp;quot; Debug=&amp;quot;true&amp;quot; Service=&amp;quot;WcfServiceLibrary.Service1&amp;quot; %&amp;gt;&lt;/p&gt;  &lt;p&gt;Así mismo, el proyecto que contiene la librería para los servicios, tiene su propio fichero de configuración App.config, el cual no será necesario puesto que el que nos interesa es el Web.config que aparece en la aplicación WCF. Por tanto, también eliminamos el fichero App.config. &lt;/p&gt;  &lt;h3&gt;Configuración del servicio &lt;/h3&gt;  &lt;p align="justify"&gt;A la hora de configurar el servicio podemos ver el que el fichero Web.config está muy bien comentado, lo cual permitirá guiarnos en la configuración. Sin embargo, vamos a utilizar una herramienta para editar la configuración y partiremos de cero para ir evolucionándola poco a poco. Sobre el fichero Web.config abrimos el menú contextual y abrimos el editor para la configuración de WCF. Si no aparece en el menú contextual (puede ocurrir si es la primera vez que se utiliza) podemos acceder a él desde el menú Tools.&lt;img style="border-right-width:0px;margin:0px 0px 0px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="08-TipoDelServicio" border="0" alt="08-TipoDelServicio" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/cgonzalez/08TipoDelServicio_5F00_6399689E.jpg" width="483" height="484" /&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Lo primero que vamos a hacer es crear un servicio nuevo y lo primero que nos va a pedir es que indiquemos el tipo del servicio. Mediante el explorador de ficheros accederemos a la carpeta de nuestra librería y accedemos a la .dll correspondiente (acuérdate de compilar previamente :)). Con ello seleccionamos la implementación del servicio y, en el siguiente paso, el contrato asociado. &lt;/p&gt;  &lt;p align="justify"&gt;Después escogemos el modo de comunicación, podemos elegir entre TCP, HTTP, Named Pipes, MSMQ o P2P. A nosotros el que nos interesa es HTTP, el cual es la opción por defecto pero cada uno debe mirar qué opción es la que más le interesa; en este &lt;a href="http://msdn.microsoft.com/es-es/library/ms733769.aspx"&gt;enlace&lt;/a&gt; podéis encontrar más información al respecto. Después seleccionamos el método de interoperabilidad que, en nuestro caso, dado que utilizamos WCF, será Advanced Web Services interoperability y, de nuevo, dejamos la opción por defecto. Por último nos pide indicar la dirección para el endpoint que vamos a crear. Sin embargo, en lugar de ello, lo que vamos a hacer es darle una dirección base al host, de modo que dejamos en blanco la dirección (deberemos confirmarle que la queremos dejar en blanco) y cerramos el asistente.&lt;/p&gt;  &lt;p align="justify"&gt;Para indicar la dirección base para el host del servicio, desplegamos el servicio que acabamos de configurar y en el nodo Host especificamos la dirección base, en nuestro ejemplo: http://localhost/WcfServiceApplication/Service1.svc.&lt;/p&gt;  &lt;p align="justify"&gt;Los siguiente que haremos será crear un comportamiento asociado al servicio. Para ello, en la sección Advanced, creamos un nuevo Service Behavior y añadimos un elemento de tipo serviceMetadata. Hacemos doble clic sobre el elemento creado y ponemos el atributo HttpGetEnabled a true. Esto nos permitirá publicar los metadatos del servicio. Después seleccionamos el endpoint creado para nuestro servicio y le indicamos que su comportamiento asociado es el que acabamos de crear.&lt;/p&gt;  &lt;p align="justify"&gt;Una vez terminado con esto, el aspecto del Web.config debería ser algo así:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;UTF-8&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behavior &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;serviceBehavior&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
                    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;serviceMetadata &lt;/span&gt;&lt;span style="color:red;"&gt;httpGetEnabled&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;true&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
                &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behavior&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;services&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;service &lt;/span&gt;&lt;span style="color:red;"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;serviceBehavior&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;WcfServiceLibrary.Service1&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;endpoint &lt;/span&gt;&lt;span style="color:red;"&gt;binding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;ws2007HttpBinding&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;contract&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;WcfServiceLibrary.IService1&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;host&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;baseAddresses&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add &lt;/span&gt;&lt;span style="color:red;"&gt;baseAddress&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;http://localhost/WcfServiceApplication/Service1.svc&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
                    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;baseAddresses&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;host&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;service&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;services&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;font size="2" face="Courier New"&gt;&lt;/font&gt;

&lt;h3&gt;Configuración de IIS &lt;/h3&gt;

&lt;p align="justify"&gt;Vamos a empezar con la configuración de IIS y para ello, lo primero que tenemos que hacer es decirle a la aplicación del servicio WCF que su hospedaje va a estar en IIS. Abrimos las propiedades del proyecto y seleccionamos la pestaña de Web y, en el apartado de Servers, cambiamos la selección a usar el servidor IIS local. Automáticamente nos pondrá la url asociada y lo único que queda por hacer es pulsar el botón para crear el directorio virtual.&lt;/p&gt;

&lt;p align="justify"&gt;Si abrimos Internet Information Services Manager podemos ver que se ha hospedado correctamente, al desplegar el árbol de sitios web nuestra aplicación (en mi caso WcfServiceApplication) debería aparecer ahí. Para comprobar que realmente nuestro servicio funciona podemos poner su dirección en el explorador (http://localhost/WcfServiceApplication/Service1.svc) y nos deberá mostrar un ventana como la siguiente: &lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="10-Servicio" border="0" alt="10-Servicio" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/cgonzalez/10Servicio_5F00_18E27B04.jpg" width="1028" height="171" /&gt; &lt;/p&gt;

&lt;p align="justify"&gt;Hemos visto como crear un servicio WCF en IIS, pero no hemos acabado aún. La gracia de todo esto es que tengamos un cliente que consuma las operaciones que expone el servicio pero… eso lo dejaremos para otro post.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=151877" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/cgonzalez/archive/tags/Servicios/default.aspx">Servicios</category><category domain="http://geeks.ms/blogs/cgonzalez/archive/tags/WCF/default.aspx">WCF</category><category domain="http://geeks.ms/blogs/cgonzalez/archive/tags/IIS/default.aspx">IIS</category></item></channel></rss>
