Cómo acceder a las cabeceras de HTTP de la respuesta de un servicio WCF en .NET Compact Framework

Si has programado algún cliente WCF en .NET Compact Framework, habrás visto que, por el momento, el único binding admitido es el básico (basicHttpBinding) con lo que se están tratando esencialmente servicios Web.

Para usarlos desde .NET Compact Framework lo habitual es crear una clase proxy que facilite el acceso al servicio. Para ello se utiliza la herramienta «netcfsvcutil.exe» que funciona de manera similar a la utilidad de «Agregar referencia web» de Visual Studio. Se apunta la herramienta al WSDL del servicio y ésta genera el código necesario para utilizarlo.

En este caso, «netcfsvcutil» generará dos ficheros que hay que incluir en los proyectos. Uno llamado CFClientBase y otro con el nombre del servicio, que será la clase proxy a usar y que a su vez hereda de CFClientBase.

Al usarlos en el código, habrá que crear una instancia de la clase generada como proxy que incorpora todas las operaciones disponibles en el servicio que serán los métodos marcados en el servicio WCF como «OperationContract» y los datos exportados, marcados como «DataContract».

Su uso final es muy simple ya que sólo hay que crear un objeto del tipo del proxy y llamar a la función generada correspondiente, pero de tan sencillo que es, se oculta mucha funcionalidad que puede ser necesaria en algún momento y no está accesible.

En un caso reciente quise obtener la cabecera «Date» de la respuesta HTTP del servicio WCF, pero esta información no está presente en el proxy en ningún sitio. Después de indagar bastante di con la solución. En la clase CFClientBase generada hay un método llamado «getReply«. Este método devuelve un objeto de tipo System.ServiceModel.Channels.Message, que contiene el mensaje devuelto por el servicio WCF. Este mensaje a su vez incluye una colección llamada «Properties«. Dentro de estas propiedades hay una llamada «httpResponse» (accesible como message.Properties[«httpResponse»]) que es de tipo HttpResponseMessageProperty. Una vez ahí se dispone de toda la respuesta http y, en concreto, están accesibles las cabeceras HTTP como una colección llamada «Headers«.

En mi caso, modifiqué la clase CFClientBase para exponer el mensaje de respuesta como una propiedad y tenerlo accesible así desde mi código de una forma cómoda. Hay que recordar que si se vuelve a generar el proxy mediante netcfsvcutil se perderán esos cambios y habrá que volver a incorporarlos.

Mi código final para acceder a la fecha de la respuesta HTTP queda algo así (una vez he expuesto la propiedad ReplyMessage en el proxy y sin control de errores):

string fechaHeader = 
 ((HttpResponseMessageProperty)
 proxy.ReplyMessage.Properties["httpResponse"]).Headers["Date"];
 
DateTime fecha = DateTime.Parse(fechaHeader);

 

El problema que le veo a todo esto es que la respuesta Http venga como una propiedad indexada de esa forma, lo que no me da mucha confianza en que esta funcionalidad se pueda perder en futuras versiones de .NET Compact Framework, ya veremos…