lunes, 28 de enero de 2008

WCF - WcfServiceHost, WcfTestClient, SvcConfigEditor y SvcTraceViewer.

Muy buenas de nuevo, siento haber estado desaparecido una temporada, pero como mi madre dice "En misa y repicando", ¡no,no,no...! jejeje...

En fin, en esta ocasión y antes de comentar varios casos sobre WCF (Windows Communication Foundation),voy a hacer mención a varias de las herramientas que nos van a permitir poder trabajar un poquito mejor. Para hacer más fácil su uso y comprensión, ¡que mejor que hacer un pequeño ejemplo y ver su funcionamiento!.

  1. En primer lugar creamos un proyecto "WCF Service Application".
  2. Publicamos el Web service en nuestro IIS: Ej: en http://localhost/WcfService1/ .
  3. Comprobamos el acceso al servicio desde iexplorer: http://localhost/wcfservice1/service1.svc
  4. Hasta aquí, todo perfecto, todo funciona, perfectamente. Nota: Al publicar un servicio por primera vez, la la autenticación se establece como "anónima".
  5. Ahora veamos como configurar nuestro servicio. "WCF Service Configuration Editor".   Por defecto una vez creado el servicio, el Binding es "wsHttpBinding" para nuestro Services - EndPoint

Con Internet Explorer, todo funciona correctamente, si creamos una aplicación de consola (en 3.0 ó 3.5) y añadimos una referencia a nuestro WCF Service "Add Service Reference" se crea una clase proxy y listo. Poco hemos hecho hasta este momento, jejeje... ¡vamos por buen camino!

Ahora utilizando la siguiente herramienta, podremos chequear nuestro WCF Service sin necesidad de tener que crear una aplicación de test como la anterior, además podremos visualizar todas las peticiones y respuestas de tipo SOAP.

WcfTestClient

C:\Development\WCF\Samples\WcfService1>wcftestclient http://localhost/WcfService1/Service1.svc



Todo sigue funcionando correctamente y hemos chequeado la funcionalidad del WCF Service. Ya tenemos todo apunto.


NOTA: Ni que decir tiene que el servicio que se quiere testear ha de estar en ejecución, de lo contrario un error amenizará la ocasión, jijiji...


 


Ahora otra forma de hostear nuestro Web Service:


WcfServiceHost


¿Porque necesito "obligatoriamente" hostear mi WCF service en IIS?, pues bien, con esta herramienta proporcionada por WCF no será necesario, simplemente diferente a como estamos acostumbrados, podemos evitar el tener que instalar IIS, bien porque no queremos o no tenemos el CD/DVD correspondiente o, simplemente debido a las prisas, cosa que suele ser bastante común, jejeje...



Asegura de que el servicio no está hosteado en IIS para que no existan conflictos, también hay que estar seguro de que la propiedad Address del Endpoint del servicio tiene el valor "http://localhost/Wcfservice1/service1.svc", seguidamente tecleamos:


C:\Develpment\WCF\Samples\WcfService1> wcfsvchost /service:"./bin/WcfService1.dll" /config:web.config

Tras ejecutar este comando se carga el WCF Service en la herramienta, pero ¿Que ocurre?, pues que tenemos un error:


1 System.InvalidOperationException: The HttpGetEnabled property of ServiceMetadataBehavior is set to true and the HttpGetUrl property is a relative address, but there is no http base address. Either supply an http base address or set HttpGetUrl to an absolute address.
2 at System.ServiceModel.Description.ServiceMetadataBehavior.EnsureGetDispatcher(ServiceHostBase host, ServiceMetadataExtension mex, Uri url, String scheme)
3 at System.ServiceModel.Description.ServiceMetadataBehavior.CreateHttpGetEndpoints(ServiceDescription description, ServiceHostBase host, ServiceMetadataExtension mex)
4 at System.ServiceModel.Description.ServiceMetadataBehavior.System.ServiceModel.Description.IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
5 at System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost)
6 at System.ServiceModel.ServiceHostBase.InitializeRuntime()
7 at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
8 at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
9 at System.ServiceModel.Channels.CommunicationObject.Open()
10 at Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)

Utilizamos el editor de configuración de WCF (SvcConfigEditor) y  asignamos el valor http://localhost/WcfService1/Service1.svc a la propiedad  HttpGetUrl según muestro en la siguiente imagen:

 

Si  ahora intentamos ejecutar de nuevo la instrucción veremos como el WCF Service es iniciado correctamente. En este momento ya lo tenemos nuevamente "hosteado".


También existe la posibilidad de lanzar estas dos aplicaciones "Servidor/Host" y "Cliente/Client" de una sóla "atacada", :-D


C:\Develpment\WCF\Samples\WcfService1> wcfsvchost /service:"./bin/WcfService1.dll" /config:web.config /client: MyClient.exe /clientArgs:123456, abcdef

 


Trazas - SvcTraceViewer


Esta herramienta con una interfaz gráfica que se distribuye con WCF, aunque por otro lado "no estoy seguro", parece que con algunas versiones de VSTS si es así, no obstante, con el SDK de Windows se distribuye y  en cualquier caso, aquí os dejo un ".zip" con dicha herramienta.


El objetivo de esta es mostrar la información almacenada en los ficheros ".svclog", que son generados por el "Service.Model" configurado en los web.config de los WCF Services; un fichero de mensajes y otro de trazas.


Referencia: http://msdn2.microsoft.com/en-us/library/ms732023.aspx 


Existe otra herramienta de terceros "Live Service Trace Viewer" (http://blogs.msdn.com/craigmcmurtry/archive/2006/09/19/762689.aspx) que a pesar de mostrar la misma información (.svclog) lo hace de una forma mucho más gráfica y "quizás" más intuitiva.

Como vemos  WCF está comenzando a dar mucho juego y por supuesto a facilitarnos mucho el trabajo, en fin, mientras sea así, todo será bienvenido, :-D

 

Espero haber sido de ayuda una vez más.
Saludos y hasta la próxima.
Juanlu


Comments:
Todo bien excelente el post.
Tengo una duda, en donde es mejor publica mi logica en un WCF Service Application o en WCF Service Library, porque yo tengo mi capa de datos, luego de logica y este lo publico en un WCF Service Library con las herramienta que tu lo explicas en el post, y me funciona todo bien uso el binding net.tcp, y funciona todo bien, pero se cuelga cuando tengo concurrencia de usuario, no se que pasa.
 
Yo pondría la lógica en WCF Service LIbrary.
En cuanto a la concurrencia. Configura el servicio según los atributos InstanceContextMode y ConcurencyMode.
Echa un vistazo tambien a "Service Throttling": http://msdn.microsoft.com/en-us/library/system.servicemodel.description.servicethrottlingbehavior.aspx
 
Gracias por las herramientas, actualmente estoy usando el SvcConfigEditor pero la configuracion adicional no llega a ser consumida como que la ignora. ya revise los nombres y todo, te dejo mi correo si pudieras contactarme conmigo gracias. angel1d@hotmail.com
 
Publicar un comentario



<< Home

This page is powered by Blogger. Isn't yours?