2012-06-19 50 views
8

He creado un servicio web utilizando WCF. No puedo averiguar cómo establecer las restricciones y restricciones en WSDL/XSD a través del contrato de datos.Enlazar un WSDL personalizado a un servicio WCF existente

¿Qué sucede si mejoro el esquema XSD2 con las restricciones y luego enlazo este esquema personalizado al servicio existente? Si es así, ¿cómo puedo hacer que el servicio exponga el WSDL mejorado? De lo contrario, ¿hay alguna otra manera de establecer los metadatos para un servicio WCF?

Respuesta

1

Este Pareciera ser un problema común. Los metadatos del servicio describen el contrato de datos. Es decir, la estructura de los datos intercambiados, sin ninguna información de validación.

He estado resolviendo este problema implementando una capa de validación en la parte superior de la capa de servicio. Va como sigue:

Además de un WSDL, el autor del servicio y el consumidor también acuerdan un XSD refinado que describe todos los detalles de validación además de la mera estructura de los contratos de datos.

Cada parte (xml) serializa y valida los contratos de datos contra el refinado XSD.

Muestra de "pseudocódigo" para un método de servicio que valida la solicitud contra un XSD.

public string MyServiceMethod(MyDataType m){ 
    string s = XmlSerialize(m); 
    if(XSDValidate(s)){ 
     return ProcessRequest(m); 
    }else{ 
     return BuildErrorResponse("The request is not compliant with the contract"); 
    } 
} 

El consumidor del servicio también puede implementar una lógica similar para validar los datos de solicitud antes de enviarlos al servidor.

+0

Gracias. Es la forma en que estoy siguiendo actualmente. Pero estoy tratando de entender si es posible obtener el esquema y sus restricciones del contrato de datos. –

3

Por favor, no confunda XSD y WSDL - this is totally different things

Según su pregunta - trate de usar RiaServices. Se le permite escribir dicho código como

public class Meeting 
{ 
    [Key] 
    public int MeetingId { get; set; } 

    [Required] 
    public DateTime Start { get; set; } 

    [Required] 
    public DateTime End { get; set; } 

    [Required] 
    [StringLength(80, MinimumLength = 5)] 
    public string Title { get; set; } 

    public string Details { get; set; } 

    [Required] 
    [RegularExpression(@"\d{1,3}/\d{4}", 
    ErrorMessage = "{0} must be in the format of 'Building/Room'")] 
    public string Location { get; set; } 

    [Range(2, 100)] 
    [Display(Name = "Minimum Attendees")] 
    public int MinimumAttendees { get; set; } 

    [Range(2, 100)] 
    [Display(Name = "Maximum Attendees")] 
    public int MaximumAttendees { get; set; } 
} 

que yo sepa, la única manera de mejorar su WSDL con limitaciones y restricciones que se marque sus clases DataContract con restringir los atributos (arreglarme si no es verdad)

+0

Gracias por aclarar. Parece que RIAServices es la solución que estaba buscando. ¿Puede un cliente que no es MS consumir RIAServices? –

+1

RiaServices diseñados específicamente para soluciones de extremo a extremo Silverlight y ASP.NET. Esto no es un rechazo a la posibilidad de consumir RiaServices por PHP o Java, pero es posible que encuentre muchas trampas y trampas en ese camino –

1

usted tiene básicamente dos formas de crear un servicio web:

  1. Código primero. Usted crea una clase y la marca como una clase de contrato de datos más algunos atributos más. Cuando compile esto, el WSDL de su servicio web se generará a partir de su clase. Este es un método rápido y, a menudo, le brinda suficiente control sobre WSDL.

  2. Esquema primero. Usted crea el WSDL a mano y utiliza una herramienta (por ejemplo, WSCF.Blue o) para generar la clase de contrato de datos de su WSDL. Esto le dará un control completo sobre su esquema WSDL, pero en mi experiencia, es más trabajo crear WSDL que una clase de contrato de datos.

+0

Buen punto. He codificado los primeros.Entonces, ¿es posible dar forma al contrato de datos para establecer restricciones WSDL? –

Cuestiones relacionadas