Microsoft MVP

Email y Rss

email rss

Klout

Seguidores en facebook

Timeline de mi Twitter

Tienes preguntas?

Ideas de un Conejo
Más allá de los sistemas de información: (C#)=> videojuegos, soluciones a problemas interesantes y Sistemas Operativos
XNA
C#
Sistemas Operativos
Varios
Windows Phone
WinRT
XAML
Azure
HTML 5
Acerca de

C# – WCF – El caso del wsdl con xsd:import schemalocation que no puede ser interpretado desde clientes PHP

July 25th, 2012 by JuanK

Follow @JuanKRuiz

WCF – El caso del wsdl con xsd:import schemalocation que no puede ser interpretado desde clientes PHP

o

El caso del wsdl con referencias externas que no puede ser usado en PHP

Este caso esta relacionado con el caso revisado en el artículo:

WCF – El caso del wsdl con referencias externas apuntando al servidor local

Por lo cual es otra anecdota de casos de consultoria :) .

Supongamos que creamos un servicio WCF en http://my.webpage.com.co , como ya sabemos cuando creamos servicios con WCF el wsdl no muestra directamente los tipos de dato del servicio, sino que genera referencias a unos schemas xsd donde únicamente estan estos detalles, ejemplo:

  <wsdl:types>
    <xsd:schema targetNamespace="http://tempuri.org/Imports">
      <xsd:import schemaLocation="http://my.webpage.com.co/MyService.svc?xsd=xsd2"
                  namespace="http://tempuri.org/"/>
      <xsd:import schemaLocation="http://my.webpage.com.co/MyService.svc?xsd=xsd0"
                  namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
      <xsd:import schemaLocation="http://my.webpage.com.co/MyService.svc?xsd=xsd1"
                  namespace="http://schemas.datacontract.org/2004/07/MyService"/>
    </xsd:schema>
  </wsdl:types>
        

En otra oportunidad analizaremos el contenido de esas url, pero no es nada complejo.

El problema reside en que muchos clientes SOAP, sobre todo de tecnologías como PHP, no son capaces de interpretar este tipo de schemas xsd dentro de un wsdl, por lo cual la tarea de consumir el servicio WCF en ocasiones complicada

Los clientes SOAP para PHP en su mayoría requieren que el wsdl incorpore TODAS las especificaciones dentro de si, no soportan referencias externas, así que hay que 'aplanar' el wsdl para que todo quede en el mismo archivo.

Hay dos formas de solucionar este problema

  • Forma fácil: Utiliza Framework 4.5, en el cual por defecto WCF incluye la opción de consultar el wsd así:http://my.webpage.com.co/MyService.svc?singlewsdl ,lo que es el mismo wsdl de siempre pero sin referencias externas, TODO EN UNO.
  • Sino puedes pasarte a Framework 4.5, lo cual es muy probable en escenario empresariales, entonces continua leyendo este artículo.

Esta tarea requiere realizar algunas modificaciones a nivel de behaviors y endpoints, de hecho debes crear nuevos behaviors, no es nada del otro mundo, pero como todo, requiere tiempo, aprendizaje, pruebas etc. y si estas de afán multiplica este efecto por cien.

Por suerte existen personas que les gusta compartir conocimiento y este caso no es la excepción, en CodePlex, encontramos un proyecto llamado:

WCFExtras

Cuyo lema es: "WCF Soap Header support, Xml comments to WSDL annotation and more", a que te suena muy intereante! :D

Bien, se los dejo como tema para revisar, este artículo no trata de conocer a fondo WCFExtras, tan solo una pequeña parte para solucionar nuestro lio.

Una de las funcionalidades de WCFExtras es "Single WSDL file", les suena familiar? en efecto esta funcionalidad nos permite 'aplanar' el wsdl para que no tenga referencias externas sino todo incorporado de una vez en un mismo archivo, justo lo que necesitamos.

Cómo se soluciona?

Lo primero que debemos hacer es bajar WCFExtras y compilar la dll, la agregamos al proyecto donde creamos nuestro servicio.

Seguidamente editamos el archivo app.config y adicionamos la siguiente extensión de behaviors

  <system.serviceModel>
          <extensions>
      <behaviorExtensions>
        <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
      </behaviorExtensions>
    </extensions>    
  </system.serviceModel>
        

Esto ya nos garantiza que podemos acceder a los nuevos behaviors incorporados con WCFExtras. Así que ahora solo basta utilizarlos para nuestro caso puntual, esta es la forma más sencilla de generar un wsdl 'aplanado', simplemente agregamos un behavior en endpointBehaviors, el tipo del behavior es wsdlExtensions y le pasamos como parámetro singleFile=true

    <behaviors>
      <endpointBehaviors>
        <behavior>
          <wsdlExtensions singleFile="true"/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
    </behaviors>
    

Eso es todo, hora de consultar el wsdl de nuevo y... ya no tenemos nada parecido a lo que vimos más arriba, en su lugar encontramos algo como esto inclusive para los tipos complejos:

  <wsdl:types>
    <xs:schema attributeFormDefault="qualified"
               elementFormDefault="qualified"
               targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/">
      <xs:element name="anyType"
                  nillable="true"
                  type="xs:anyType"/>
      <xs:element name="anyURI"
                  nillable="true"
                  type="xs:anyURI"/>
      <xs:element name="boolean"
                  nillable="true"
                  type="xs:boolean"/>
      <xs:element name="byte"
                  nillable="true"
                  type="xs:byte"/>
      <xs:element name="dateTime"
                  nillable="true"
                  type="xs:dateTime"/>
       <!--Codigo recortado-->	
    </xs:schema>
  </wsdl:types>	
        

TODA la información ha sido consolidada en el mismo wsdl.

Print Friendly

Follow @JuanKRuiz

  • No hay comentarios »
  • Publicado en la categoría 'C#'

Deja un comentario

Redes Sociales

Follow @JuanKRuiz
Answer Questions

Busca en el blog

Artículos Relacionados

  • C# – WCF – El caso del wsdl con referencias externas apuntando al servidor local
  • Artículos Relacionados

  • C# – WCF – El caso del wsdl con referencias externas apuntando al servidor local
  • Nube de Temas

    API - Azure - C# - codigo - Forms - IE - IE9 - Image - imagenes - IT - Microsoft - MVP - Pinned - PowerShell - Proceso - rendimiento - RSS - sistema - Sistemas Operativos - Site - Visual - WCF - Windows - Windows 8 - Windows Store - WinRT - WndProc - WPF - XAML - XNA

    Blogs recomendados

  • VBCodigoPocketPC Espacio para tratar temas de programacion para dispositivos moviles, Pocket PC, Compact Framework, Embbeded Visual Basic, Visual Basic.NET , C# (C Sharp)
  • Róbinson Moscoso Estaré publicando acá cosas sobre tecnologia .NET, situacioines cotidianas de las que voy aprendiendo… sirve como extensión de memoria.
  • .Net C# Blog de Nelsón Venegas
  • Warnov Microsoft Developer Evangelist
  • IT LIfe Blog de mi Hermano que esta en el lado claro: IT
  • Sorey Garcia Una chica del común con la firme intención de no serlo
  • Black Byte videojuegos, modelado y animación 3d
  • Road to IT World Cosas interesantes de IT
  • Marcela Chitiva Un poco de esto… un poco de aquello
  • Surviving the Nigth El mejor blog para aquellos que nos gustan los “internals”
  • Meta

    1. Log in
    2. WordPress

    Ideas de un Conejo is powered by Wordpress. Theme designed by Juan Carlos Ruiz.