¿Cómo puedo forzar a WCF a autogenerar WSDL con los parámetros de método requeridos (minoccurs = "1")?

StackOverflow https://stackoverflow.com/questions/1438623

  •  08-07-2019
  •  | 
  •  

Pregunta

Mientras uso WCF y OperationContracts tengo definido el siguiente método:

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

Cuando el tiempo de ejecución de WCF traduce esto a WSDL, termina con minoccurs = " 0 " enumerados para los parámetros someId y messageData (y posteriormente arroja un error de tiempo de ejecución si faltan estos parámetros).

Si genero un proxy usando SoapUI obtengo algo parecido 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 se marca con el atributo DataMemeber usando IsRequired = " true " y por lo tanto se expone como obligatorio.

Obviamente, es 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 porque no parece una forma obvia de hacerlo (leyendo intellisense / msdn / google). O me estoy quedando ciego y pasando por alto algo obvio.

¿Alguna pista?

¿Fue útil?

Solución

Acabo de escribir una Publicación de blog sobre este tema, ya que me encontré con el problema la semana pasada. Explica cómo puede modificar los metadatos que WCF genera en tiempo de ejecución.

Además de descargar el archivo fuente, solo necesita agregar un atributo a la definición de su contrato. Me gusta así:

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

Aquí está la publicación del blog que lo explica con más detalle: Control de WSDL minOccurs con WCF

Otros consejos

Verifique que MyComplexType esté marcado con un atributo [DataContract].

Para mi propio contrato WCF, descubrí que minOccurs = 1 no se mostraría para IsRequired = true en el wsdl generado hasta que toda la cadena de objetos implicados en el contrato se marcara como tal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top