2012-04-29 17 views
14

He creado un servicio WCF, pero el servicio WSDL no muestra mis clases (tipos complejos).tipo complejo no está disponible en wcf wsdl

A continuación es el servicio:

[ServiceContract] 
public interface IFedexService 
{ 
    [OperationContract] 
    ShipmentReply CreateMultiFedExShipment(RxRdShipment shipment); 

    [OperationContract] 
    ShipmentReply CreateFedExShipment(RxRdShipment shipment); 
} 

Y mi definición de clase es:

[DataContract] 
public class ShipmentReply 
{ 
    [DataMember] 
    public string ReferenceNumber { get; set; } 

    [DataMember] 
    public string MasterTrackingNumber { get; set; } 

    [DataMember] 
    public List<ReplyPackage> Packages { get; set; } 

    [DataMember] 
    public bool Response { get; set; } 

    [DataMember] 
    public RxNotification Notification { get; set; } 
} 

Mi problema es que no encontré esta clase ShipmentReply en WSDL. ¿Cuál es el problema mío?

Gracias, Arefin

Respuesta

28

Sí, eso es normal para WCF. De forma predeterminada, WCF mostrará solo las operaciones en el propio WSDL: las estructuras de datos están documentadas en archivos XSD que están vinculados al archivo WSDL.

Estoy apostando si nos fijamos en el WSDL, verá algo similar a esto casi en la parte superior de su WSDL:

<xsd:schema targetNamespace="http://tempuri.org/Imports"> 
    <xsd:import schemaLocation="http://localhost:8000/HelloIndigo?xsd=xsd0" 
       namespace="http://tempuri.org/" /> 
    <xsd:import schemaLocation="http://localhost:8000/HelloIndigo?xsd=xsd1" 
       namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> 
    <xsd:import schemaLocation="http://localhost:8000/HelloIndigo?xsd=xsd2" 
       namespace="http://schemas.datacontract.org/2004/07/WCF_Simple_Service" /> 
</xsd:schema> 

Estos son enlaces a los archivos XSD necesarios - introduzca la URL en su navegador, y uno de ellos (probablemente el que tiene el número más alto, pero no tiene que ser ese) contendrá su definición de tipo complejo.

Prueba este URL en su navegador (adaptar el puerto y la dirección URL real a lo que tienes):

http://localhost:8080/HelloIndigo?xsd=xsd2 

Esto debe darle el XSD para su tipo complejo

Esta característica ha causado algunos problemas en los últimos años, algunos clientes no pueden manejar esta sintaxis (100% correcta y perfectamente correcta). Por lo tanto, en .NET 4.5, WCF tendrá un nuevo parámetro (...?singlewsdl) para generar su WSDL completo, incluidos todos los elementos XSD; consulte What's new in WCF 4.5? A single WSDL file para obtener más información al respecto.

+0

Tienes razón, gracias. ¿Puede decirme una cosa ... cuando uso una propiedad de una clase que no es un contrato de datos, entonces tengo que usar __BackingField, hay algún beneficio o cualquier otra cosa que usted conozca ... –

+0

Si está utilizando '[DataContract] & [DataMember] 'atributos: ¡utilícelos donde sea que lo necesite! Esa es la manera más fácil y segura: cualquier otra cosa es un truco. –

+1

Muchas gracias. –

Cuestiones relacionadas