Evitando el namespace "http://tempuri.org" con WCF

Hace unos días me toco quitar el ya conocido http://tempuri.org del WSDL y asignarle un namespace específico, es más, esto es lo recomendado por seguridad y como buena practica, en fin, para conseguirlo bastará con lo siguiente:

  • Especificar el Namespace en el ServiceContract (Interfaces):
[ServiceContract(Namespace = "http://MyProject.Tests")]
  • Especificar el Namespace en cada uno de los tipos/clases de datos o contratos; DataContract
[DataContract(Namespace="http://MyProject.Tests")]
  • Quitar el http://tempuri.org de la definición del WSDL y para ello:

    • Añadir el siguiente atributo  al servicio:

    [ServiceBehavior(Namespace="http://MyProject.Tests")]
  • Modificar/Añadir valor a la propiedad “bindingNamespace” del endpoint del servicio según indico concretamente en la línea 2, si no se tiene en cuenta este punto, el namespace por defecto es es “tempuri.org” y aunque cambiemos el namespace en los tres puntos anteriores, este no cambiará:
1 <service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior"> 2 <endpoint bindingNamespace="http://MyProject.Tests" address="" binding="wsHttpBinding" contract="WcfService1.IService1">

ó, graficamente:

El valor para esta propiedad, aunque puede ser cualquiera, ¡con un poco de sentido común, claro!, sería conveniente que tomara el mismo que el indicado para el “[ServiceBehavior]”.

Este último punto fue el que más tardé en encontrar, ¡y mira que está visible! 😀  ¡si leyera un poco de vez en cuando!, jeje… ¡si es que lo dice claramente al pie de la ventana! De todos modos, es curioso, porque todos los post y artículos que hacen referencia a los namespaces, pasan por alto este último punto.

 

Una ayudita más, un gran logro, :-D.

Saludos
Juanlu

WCF – "ServiceModelReg -i"

Durante el día de ayer mientras trabajaba con WCF en una máquina virtual, tuve la necesidad de instalar Exchanger Server 2003 junto con OWA porque el proyecto en el que estoy en cierta forma lo requería, cual fue mi sorpresa cuando tras la instalación, los web services desarrollados con WCF (Framework 3.0) dejaron de funcionar. El error “The page cannot be display” o “Service Unavailable” ¿Por qué? ¿A que se debe esto?, pues bien, la respuesta es muy fácil,¡claro ahora que la conozco! Los ficheros “.svc” no son reconocidos, las ISAPI que tratan estos ficheros no se encuentran registradas y por tanto es necesario volverlas a registrar, jeje… ¡es lo que tiene el instalar y desinstalar cosas en las máquinas de desarrollo!

Estos son los pasos a realizar:

  • C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Aspnet_regiis -i – enable. (Esta ya es bastante conocida y seguro que a más de uno nos a pasado más de una vez).
  • C:WINDOWSMicrosoft.NETFrameworkv3.0Windows Communication FoundationServiceModelReg -i

Tras la ejecución de este comando

En esta página, explica los pasos más en profundidad así como la reparación manual si fuera necesario.

 

Justo hoy, un añito más viejo, jejeje…
Gracias a tod@s por compartirlo conmigo
Juanlu

Fiddler 2 – Depurador y sniffer

Aunque muchos de vosotros ya conocéis posiblemente esta herramienta y a pesar de que lleva tiempo publicada, quiero hacerle mención para aquellos que no la conocen y decir que en más de una vez me ha sacado de un apuro, jeje…, en fin, es una de esas herramientas que debe formar parte del repositorio de cada desarrollador, ¡de mi colección ya forma parte!.  En otras ocasiones he comentado sobre herramientas similares (WSE 2.0 Tracing Utility y TCPTrace (Un Sniffer TCP)) a esta, pero esta, sin lugar a dudas las supera con creces, al menos esa es mi opinión.

Páginas html al completo, contenidos de ficheros “.js”, “.css”, imágenes, peticiones y respuestas SOAP, posibilidad de editar y realizar peticiones, multitud de vistas posibles para hacer más fácil su uso, estadísticas, filtros, por si fuera poco permite hasta breakpoints y,… yo que sé cuantas cosas más… ¡Una herramienta que lo tiene todo!  La verdad, merece la pena, si podéis, echarle un vistazillo, no os arrepentiréis.

Es gratuita y podéis encontrarla aquí:  http://www.fiddlertool.com/fiddler/

 

“Por un camino más sencillo y cercano”

Gracias
Juanlu

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:DevelopmentWCFSamplesWcfService1>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:DevelpmentWCFSamplesWcfService1> 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”, 😀

C:DevelpmentWCFSamplesWcfService1> 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, 😀

 

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

YO, Robot. Yo, Visual Studio 2008 – OnobaNet (Huelva)

En esta ocasión quiero comentar el éxito conseguido el pasado viernes en Huelva y por supuesto, agradecer a Fran y a Miguel la posibilidad que me brindaron de poder ser uno de los ponentes, a Paco agradecerle también el maravillo esfuerzo que hizo por conseguir darnos esa publicidad espectacular, tanto en los Carteles que diseño como en la publicidad que mostraban los autobuses de la capital. (Chicos ya nos mandaréis esa foto :-D).

A Bruno tampoco quiero dejarlo atrás, puesto que fue el quien me metió en este “Berengenal”, jeje… en serio, un gran placer poder trabajar con el en este evento, como tu dirías, Bruno, “Felicitaciones” jejeje…

Aquí os dejo una referencia al Blog de Bruno donde se encuentran todas las fotos del evento así como aquellas de las degustaciones nocturnas, es decir el motivo del viaje, :-P:

http://elbruno.com/blogs/elbruno/archive/2007/12/15/evento-materiales-de-la-presentacion-quot-yo-robot-quot-en-huelva.aspx

El Cartel: http://img49.imageshack.us/img49/7743/071214eventoyorobotgs5.jpg

  

Saludos @todos
Juanlu

Windows Communication Foundation (WCF) – BUG 1

Seguimos con otra cosita interesante, ahora sobre WCF, se trata del Configurador “WCF Service Configuration Editor“. Sabemos que es una herramienta “externa” pero a la vez, integrada en el Visual Studio 2008, bueno, o eso creo.

Es curioso, pero si intentamos abrir este configurador a partir de nuestro menú “popup” al hacer “click” sobre un fichero “.config” de un proyecto, debería abrirse, ese es su cometido, sin embargo, no ocurre así, no la primera vez, si, como digo, no, la primera vez, jejejeje….

Sigue estos pasos y verás:

  • Abre el Visual estudio y crea un nuevo proyecto.
  • Añade un item de tipo “.config”
  • Haz clic con el botón derecho sobre dicho item, y…

  • Ahora, selecciona: Menu: “Tools – WCF Service Configurator Editor”

Por último, vuelve a hacer “click” con el botón derecho sobre el item “.config” y…….. “taaaaachaaaaannnn….”, ahí esta el “tío”, 😛

Pues nada, una vez más, mostrando un camino más fácil, o por lo menos, dando a conocer los tropiezos de un largo recorrido, 😀

Saludos desde Nuevos Ministerios
Juanlu

Error en Visual Studio 2008. Camino del SP1.

 

Aquí tenemos, casi seguro uno de los primeros “errores” bug de Visual Studio 2008, se trata de Visual Studio Tools for Office en concreto, si, y además curioso, aunque también tengo que decir, que no por ello voy a dejar de utilizar VS, jejeje… no, no, no…

Aquí os dejo los pasos que yo he seguido hasta llegar a este “problemilla”:

  • Abrimos Vs2008
  • Creamos un proyecto para un Addin de Outlook.
  • Añadimos un Item de tipo Ribbon
  • Añadimos un nuevo Item de tipo UserControl de XAml (de WPF).
  • Una vez realizada una compilación, veremos como nuestro control aparece en la Toolbox. De no ser así, añádelo a mano creando un Tab y seleccionando a continuación la DLL que lo contiene.

  • Si a continuación arrastramos nuestro UserControl hacia el centro de la ventana en la que se encuentra el Diseñador de Ribbons, Zasssssssss….. No hace falta ni soltarlo, basta con dejar el ratón pulsado unos segundos y, se termina todo, 😀

He de añadir que un UserControl.xaml no puede ser hosteado en un Ribbon aunque sí en un un “FormRegion”.  En cualquier caso es algo digno de mención, ¿no?

Pues ahí lo dejo, por si alguien está interesado en alguna de las nuevas novedades de VS2008, 😀

Saludos desde 3@Cantos
Juanlu

Visual Studio 2005/2008

Muy buenas a todos, como ya sabéis el esperado VS2008, ya está aquí, concretamente a finales de noviembre e incluso antes para algunos, jejeje…

Bueno, pues ahora que está de camino, yo no puedo quedarme atrás, así que he comenzado con mis primeros pasos prácticos. Mi otro amigo el CSF también está ahí, claro que tampoco puedo dejarlo atrás, seguiré con él por supuesto, pero en Posts posteriores, ahora toca un poco de VS2008, es bueno cambiar para no cansarse de lo mismo, y claro, no quedarse anticuado, :-D.

En fin, en este caso quiero hacer una pequeña pero interesante anotación.

¿Como resetear los Settings del VS para que al iniciar VS aparezca el cuadro de diálogo “Seleccionar configuración de entorno predeterminada”? pues como en versiones anteriores y al igual que cuentan muchos posts:

DevEnv /ResetSettings

Sin embargo, es curioso, me dirijo a hacerlo pero, noooooo, no funciona, ¿Que pasará?, pues nada miro la ayuda: “DevEnv /?” y nada, no hay nada que me interese. ¡Ummmmhhh!, con la ayuda de Bruno todo solucionado, :-D, en alguna página de Microsoft también se indica (http://msdn2.microsoft.com/es-es/library/ms243146(VS.80).aspx), pero lo mejor es que no aparece en la ayuda. 🙁

DevEnv /ResetUserData

Si aún así no funciona, porque no siempre lo hace (en vs 2008 me ha funcionado siempre pero no ocurre lo mismo en VS2005), entonces:

  1. Inicia Visual Studio
  2. Menu:  “Tools – Import And Export Settings…”
  3. En  el siguiente cuadro de diálogo selecciona “Reset all settings”
  4. A continuación guarda tu “setting” actual si quieres.
  5. Y por último selecciona de la lista el nuevo “setting” que quieres cargar, este se cargará automáticamente.

Poca cosa, pero para no olvidar, 😛
Saludos
Juanlu

Un Addin para Outlook 2003/2007

“A partir de ahora crear un Addin y hacer que funcione a la primera, dejará de ser un problema”.

Hace un par de semanas “me tocó” llevar a cabo la creación de un addinl, y bueno, aunque ya lo había desarrollado otren otras ocasiones, una vez más me volví a encontrar con algún que otro problemilla (claro está que con la ayuda de Eduardo conseguí resolverlo en un menor tiempo). Así que para que no vuelva a ocurrirme esto ni a mí ni ninguno de vosotros, dejo constancia aquí de los pasos que seguí:

Creando el Addin

  • Desarrollar el Add-in a partir de los siguientes métodos de carga y descarga del. Aquí tenéis algunos ejemplos de como implementar un add-in. Por el momento y para probar que el Deploy esta “chupado” conseguido prueba a mostrar un mensaje en cada evento/método.
private void ThisAddIn_Startup(object sender, System.EventArgs e) { MessageBox.Show("Start"); } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { MessageBox.Show("Shutdown"); }

“Deployando” el Addin

Asegurar que las entradas del registro generadas al crear el proyecto son correctas y se corresponden con el siguiente fragmento a excepción del clsId y del nombre del addin, que en este ejemplo es; “OutlookAddin1”:

Windows Registry Editor Version 5.00 [HKEY_CURRENT_USERSoftwareClassesCLSID{19AAED53-31A2-4DA2-B9AE-26491E3D3FD8}] @="OutlookAddin1 -- an addin created with VSTO technology" [HKEY_CURRENT_USERSoftwareClassesCLSID{19AAED53-31A2-4DA2-B9AE-26491E3D3FD8}InprocServer32] "ThreadingModel"="Both" "ManifestLocation"="C:\Archivos de Programa\Microsoft\OutlookAddin1\" @=hex(2):25,00,43,00,6f,00,6d,00,6d,00,6f,00,6e,00,50,00,72,00,6f,00,67,00,72, 00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,25,00,5c,00,4d,00,69,00,63,00, 72,00,6f,00,73,00,6f,00,66,00,74,00,20,00,53,00,68,00,61,00,72,00,65,00,64, 00,5c,00,56,00,53,00,54,00,4f,00,5c,00,38,00,2e,00,30,00,5c,00,41,00,64,00, 64,00,69,00,6e,00,4c,00,6f,00,61,00,64,00,65,00,72,00,2e,00,64,00,6c,00,6c, 00,00,00 "ManifestName"="OutlookAddin1.dll.manifest" [HKEY_CURRENT_USERSoftwareClassesCLSID{19AAED53-31A2-4DA2-B9AE-26491E3D3FD8}ProgID] @="OutlookAddin1" [HKEY_CURRENT_USERSoftwareClassesCLSID{19AAED53-31A2-4DA2-B9AE-26491E3D3FD8}Programmable] [HKEY_CURRENT_USERSoftwareClassesCLSID{19AAED53-31A2-4DA2-B9AE-26491E3D3FD8}VersionIndependentProgID] @="OutlookAddin1" [HKEY_CURRENT_USERSoftwareClassesOutlookAddin1] @="" [HKEY_CURRENT_USERSoftwareClassesOutlookAddin1CLSID] @="{19AAED53-31A2-4DA2-B9AE-26491E3D3FD8}" [HKEY_CURRENT_USERSoftwareMicrosoftOfficeOutlookAddinsOutlookAddin1] "CommandLineSafe"=dword:00000001 "Description"="OutlookAddin1 -- an addin created with VSTO technology" "FriendlyName"="OutlookAddin1" "LoadBehavior"=dword:00000003 "Manifest"="C:\Archivos de Programa\Microsoft\OutlookAddin1\OutlookAddin1.dll.manifest"

Aquí os dejo una buena y clara referencia sobre este tema anterior: Deploying Application-Level Add-ins.

Nota: Comprueba que el ClsId al que se hace referencia en el proyeco de instalación se corresponde con el del proyecto que contiene el Addin. Para ello edita el “.csproj” en formato texto y comprueba que el atributo “ProjectGuid” tiene el mismo valor:

<ProjectGuid>{19AAED53-31A2-4DA2-B9AE-26491E3D3FD8}</ProjectGuid>

Y lo más importante, como conseguir “Full-Trust” para que la instalación se realice correctamente y el addin se cargue sin problemas (Custom Actions):

  1. Crear el proyecto “OutlookAddIn1.SetSecurity”
  2. Crear y anadir las clases “CaspolSecurityPolicyCreator” y “SetSecurity“. El contenido de estas clases puede obtenerse desde aquí.
  3. Install – CustomActionData: /assemblyName=”OutlookAddIn1.dll” /targetDir=”[TARGETDIR]” /solutionCodeGroupName=”Pruebas.OutlookAddIn1″ /solutionCodeGroupDescription=”Code group for OutlookAddIn1″ /assemblyCodeGroupName=”OutlookAddIn1″ /assemblyCodeGroupDescription=”Code group for OutlookAddIn1″ /allUsers=[ALLUSERS]
  4. “Rollback – CustomActionData” y “Uninstall – CustomActionData”: /solutionCodeGroupName=”Pruebas.OutlookAddIn1″
  5. Dejar en blanco la acción “Commit – CustomActionData”.

Prerrequisitos:

Nota: El desarrollo no sólo permitirá la ejecución en Outlook 2003 sino que además en Office 2007, ahora, eso sí, a falta de los maravillos “Ribbons”, para lo que será necesario ampliar con el desarrollo adecuado.

Más información.

En fin, espero haber servido de ayuda una vez más, ¡seguro que si! 😛
Hasta la próxima
Juanlu

Introdución a CSF II – HelloWorldAsync

Una vez más aquí estoy con CSF, en este caso para mostrar un sencillo ejemplo con nuestro querido y famoso amigo “Hola Mundo”.

Se trata de un ejemplo muy sencillo, concretamente de una invocación a un servicio web, haciendo uso, claro está, de una sesión de CSF.

Pasos:

  1. Manifiesto
    • Dos participantes .
      • Participante 1 (listener, consola windows).
      • Participante 2 (Web Service “HelloWorld”).
    • Dos reglas para el enrutamientos.
  2. Crear la sesión a partir del manifiesto anterior
  3. Envío asincrono del mensaje
  4. Terminar la sesión

Manifiesto estático (Manifest.xml)

1 <Session timestamp="0001-01-01T00:00:00.0000000-08:00" timeout="30" serialize="None" routeAnyAction="true" ackOnRouteMsgToParticipants="false" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://Microsoft/ConnectedServices/2006/06/Session/"> 2 <SessionName>HelloWorldAsync</SessionName> 3 <Participants> 4 <Participant timeout="30" role="Service" inChannelResponse="true" type="WebService"> 5 <ParticipantName>Listener</ParticipantName> 6 <ParticipantID>0000-0000-0000-0001</ParticipantID> 7 <ParticipantUrl>soap.tcp://csfvpc30:9001/Listener</ParticipantUrl> 8 </Participant> 9 <Participant timeout="30" role="Service" inChannelResponse="true" type="WebService"> 10 <ParticipantName>HelloWorld</ParticipantName> 11 <ParticipantID>0000-0000-0000-0002</ParticipantID> 12 <ParticipantUrl>http://tempuri.org/HelloWorld</ParticipantUrl> 13 </Participant> 14 </Participants> 15 16 <RoutingTable version="0" timestamp="0001-01-01T00:00:00.0000000-08:00"> 17 <Routes> 18 <Route> 19 <Criteria>(ACTION EQ 'http://tempuri.org/HelloWorld)</Criteria> 20 <Destination>HelloWorld[http://tempuri.org/HelloWorld]</Destination> 21 </Route> 22 23 <Route> 24 <Criteria>(ACTION EQ 'http://tempuri.org/HelloWorldResponse)</Criteria> 25 <Destination>Listener[http://elGuerre.loc/HelloWorldRespone]</Destination> 26 </Route> 27 </Routes> 28 </RoutingTable> 29 </Session>

Creación del manifiesto (SessionManifest)

1 private static SessionManifest CreateManifiest(){ 2 using (StreamReader streamReader = new StreamReader(String.Format(@"{0}Manifest.xml", Environment.CurrentDirectory))) 3 { 4 XmlSerializer xs = XmlSerializerCache.GetXmlSerializer( 5 typeof(SessionManifest), 6 SessionMessageNames.SessionNamespace 7 ); 8 9 return (SessionManifest)xs.Deserialize(streamReader); 10 }}

Añado también los atributos empleados para que no haya ningúna confusión:

1 private static string sessionManagerAdminUri = "http://csfvpc30/Session30/SessionAdminManager.ashx"; 2 private static string sessionUri = "http://csfvpc30/Session30/Session.ashx"; 3 private static string USER = @"csfvpc30Student"; 4 private static string PASSWORD = "pa$$word"; 5 private static string fromUri = "soap.tcp://csfvpc30:9001/Listener";

Creado el “SessionManifiest”, será necesario crear la sessión a partir del mismo. Para ello consultar el post anterior “Introducion a CSF I“.

El participante 1, es un listener cuya misión es mostrar toda aquella información en la consola de comandos. La siguiente clase crea el listener y captura la respuesta a la petición al Web Service “HelloWorld”

1 namespace HelloWorldAsync{ 2 [CsfService(Namespace = "http://elGuerre.loc/HelloWorldListener/")] 3 public class Listener 4 { 5 public Listener(string uri) 6 { 7 try 8 { 9 WSE3.Addressing.EndpointReference serviceEpr = new WSE3.Addressing.EndpointReference(new Uri(uri)); 10 WSE3.Messaging.SoapReceivers.Add(serviceEpr, this); 11 Console.WriteLine("Servicio inicializado correctamente. Endpoint: '{0}'", uri); 12 } 13 catch (Exception fault) 14 { 15 Console.WriteLine(String.Format("Fallo al añadir el servicio al endpoint {0}: {1}", uri, fault.Message)); 16 } 17 } 18 19 [Operation(Oneway = false, Action = DataTypes.Actions.HelloWorldResponse)] 20 public void SendAsync(Message message) 21 { 22 Console.WriteLine("{0}{1}{2}{3}", 23 Environment.NewLine, 24 "".PadRight(20, '-'), 25 Environment.NewLine, 26 message.BodyElement.InnerXml); 27 } 28 }}

Creada la sessión y, creado y arrancado el participante 1, se realizará el envío asíncrono. Los parámetros; from, replyTo y faultTo, se corresponden con la url del Participante 1 (fromUri) que será el encargado de capturar la respuesta así como del error si lo hubiera.

Envío Asíncrono

1 private static void SendAsync(string from, string replyTo, string faultTo, object messageData) 2 { 3 Header header = new Header(); 4 header.Addressing = new AddressingHeaders( 5 new Uri(fromUri), 6 new Uri(replyTo), 7 new Uri(faultTo)); 8 9 header.Addressing.To = new Uri(sessionUri); 10 header.Addressing.Action = action; 11 header.CsfProperties.SessionId = new Uri(sessionId); 12 13 Message message = Message.CreateMessage(header, messageData); 14 15 // Seguridad 16 message.Header.Security.Add( 17 new Microsoft.ConnectedServices.Sdk.Security.Tokens.UsernameToken(USER, PASSWORD, 18 Microsoft.ConnectedServices.Sdk.Security.Tokens.PasswordOption.SendPlainText)); 19 20 // Envío del mensaje 21 MessageSender sender = new MessageSender(); 22 sender.SendAsync(message); 23 }

Una vez finalizado el envío, sólo queda terminar la sessión si es que realmente queremos hacerlo. Para nuestros pequeños ejemplos, puede ser interesante eliminarla una vez que deje de ser usada, para así, no dejar basura excesivas sesiones creadas.

Nota: Un envío sincrono no puede ser utilizado para invocar a un Web Service estandar creado con Visual Studio. Para que esto sea posible sera necesario que este cumpla el estandar WSE. (Ya comentaré como hacerlo con otro buen ejemplo).

Pues como solemos decir; “Donde se ponga un trozo de código que se quiten todas las explicaciones del mundo“.

Espero que ahora con la practica de CSF se vea todo este “mundillo” un poquito más claro.

En sucesivos posts trataré de explicar como depurar y chequear posibles errores, temas de caché y configuración básica.

Saludos
Juanlu