Come posso forzare WCF per generare automaticamente WSDL con i parametri del metodo richiesti (minoccurs = "1")?
Domanda
Durante l'utilizzo di WCF e OperationContracts ho definito il seguente metodo:
[OperationContract]
[FaultContract(typeof(ValidationFault))]
[FaultContract(typeof(FaultException<ExceptionDetail>))]
int DoSomething(int someId, MyComplexType messageData);
Quando questo viene tradotto in un WSDL dal runtime WCF, finisce con minoccurs = " 0 " elencato per i parametri someId e messageData (e successivamente genera un errore di runtime se mancano questi parametri).
Se generi un proxy usando SoapUI ottengo qualcosa che assomiglia a questo:
<com:DoSomething>
<!--Optional-->
<com:EventId>1</com:EventId>
<!--Optional-->
<com:myComplexType >
<com:id>1</com:id>
</com:myComplexType >
</com:DoSomething>
Il campo ID in MyComplexType è contrassegnato con l'attributo DataMemeber utilizzando IsRequired = " true " e quindi è esposto come obbligatorio.
Ovviamente è abbastanza fuorviante per il WSDL specificare che un parametro è facoltativo quando non lo è, ma non riesco a vedere alcun modo ovvio per contrassegnare l'OperationContract per forzare WCF a riconoscere ed esporre questi parametri come richiesto.
Sono un po 'confuso che non sembra un modo ovvio per farlo (leggendo intellisense / msdn / google). O sto diventando cieco e trascuro qualcosa di ovvio.
Qualche indizio?
Soluzione
Ho appena scritto un Post di blog su questo argomento, mentre ho incontrato il problema me stesso la scorsa settimana. Spiega come è possibile modificare i metadati generati da WCF in fase di esecuzione.
Oltre a scaricare il file di origine, devi solo aggiungere un attributo alla definizione del tuo contratto. In questo modo:
[ServiceContract]
[RequiredParametersBehavior]
public interface ICalculatorService
{
[OperationContract]
int Add(int firstValue, int secondValue);
}
Ecco il post sul blog che lo spiega in modo più dettagliato: Controllo di minOccurs WSDL con WCF
Altri suggerimenti
Verifica che MyComplexType sia contrassegnato con un attributo [DataContract].
Per il mio contratto WCF, ho scoperto che minOccurs = 1 non si sarebbe presentato per IsRequired = true nel wsdl generato fino a quando l'intera catena di oggetti implicati nel contratto non fosse contrassegnata come tale.