2009-09-17 9 views
16

Durante el uso de WCF y OperationContracts Tengo el siguiente método definido:¿Cómo puedo forzar a WCF a generar automáticamente WSDL con los parámetros de método requeridos (minoccurs = "1")?

[OperationContract] 
    [FaultContract(typeof(ValidationFault))] 
    [FaultContract(typeof(FaultException<ExceptionDetail>))] 
    int DoSomething(int someId, MyComplexType messageData); 

Cuando esto se traduce a un WSDL por el tiempo de ejecución de WCF, termina con con minOccurs = "0" en la lista para la someId parámetros y messageData (y posteriormente arroja un error de tiempo de ejecución si faltan estos parámetros).

Si genero un proxy utilizando SoapUI consigo algo que se parece a esto:

<com:DoSomething> 
    <!--Optional--> 
    <com:EventId>1</com:EventId> 
    <!--Optional--> 
    <com:myComplexType > 
     <com:id>1</com:id> 
    </com:myComplexType > 
    </com:DoSomething> 

el campo ID en MyComplexType está marcado con DataMemeber atributo mediante isRequired = "true "y por lo tanto se expone como obligatorio.

Es obviamente bastante engañoso para el WSDL especificar que un parámetro es opcional cuando no lo es, pero no veo ninguna forma obvia de marcar el OperationContract para obligar a WCF a reconocer y exponer estos parámetros según sea necesario.

Estoy un poco desconcertado, no parece una forma obvia de hacerlo (leyendo intellisense/msdn/google). O me estoy quedando ciego y pasando por alto algo obvio.

¿Alguna pista?

+0

que he encontrado este problema Microsoft Connect https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx ? FeedbackID = 482144 que implica que esto podría no ser posible. Lo que apesta. – DavidWhitney

+0

Pensándolo mejor, parece como si los parámetros se enumeran como minoccurs = "0" porque los tipos en sí podrían ser nulos, por lo tanto, si alguien proporcionara un nulo, igual coincidiría con el método sig. Aún no ayuda a los fines de la generación de WSDL y la definición de un contrato con una aplicación/organización de llamada. – DavidWhitney

+0

el WSDL generado no se ve afectado porque el tipo podría ser nulo (tipos de referencia frente a tipos de valores). Si se omite un tipo de valor, se usará el valor predeterminado para ese tipo de valor. Ver mi respuesta a continuación sin embargo. – Thorarin

Respuesta

17

Acabo de escribir un Blog post sobre este tema, ya que me encontré con el problema la semana pasada. Explica cómo se pueden modificar los metadatos que genera WCF en tiempo de ejecución.

Además de descargar el archivo fuente, solo necesita agregar un atributo a su definición de contrato. De este modo:

[ServiceContract] 
[RequiredParametersBehavior] 
public interface ICalculatorService 
{ 
    [OperationContract] 
    int Add(int firstValue, int secondValue); 
} 

Aquí está la entrada de blog que explica con más detalle: Controlling WSDL minOccurs with WCF

+0

Enfoque interesante. ¿Me puede decir si esto funciona con todos los tipos (mariscal por referencia y mariscal por valor)? Sé que los tipos anulables tienden a leerse como desafíos en xsd generado ... Me pregunto si esto se aplica a lo que estás haciendo también. Digamos que estaba pasando varios parámetros obligatorios de 'cadena'. –

0

Compruebe que MyComplexType está marcado con un atributo [DataContract].

Para mi propio contrato de WCF, encontré que minOccurs = 1 no aparecería para IsRequired = true en el wsdl generado hasta que toda la cadena de objetos implicados en el contrato estuviera marcada como tal.

+0

qué raro es esto. – DavidWhitney

Cuestiones relacionadas