Non è ansible utilizzare parametri facoltativi quando si implementa un’interfaccia per un WCF

Nella mia interfaccia l’ho dichiarato.

[OperationContract] [WebGet] String GetStuff(String beep, String boop = "too lazy to type"); 

L’ho implementato come segue.

 String GetStuff(String beep, String boop = "too lazy to type") { ... } 

Compila e carica come mio servizio WCF. Tuttavia, quando l’ho usato come riferimento web e provo a eseguire il codice qui sotto, ottengo il compilatore che piagnucola e piange senza alcun metodo con la firma di un singolo parametro. L’ultima riga è il problema.

Come posso quindi essere troppo pigro per digitare per impostazione predefinita ?

 ServiceClient client = new ServiceClient(); client.GetStuff("blobb", "not lazy"); client.GetStuff("blobb"); 

Semplicemente: gli argomenti predefiniti non sono supportati.

Dalla progettazione e dalla ragione. Usiamo C # per scrivere contratti WCF ma questo è un trucco notazionale. Non tutte le funzionalità del linguaggio C # possono essere implementate in SOAP, REST o JSon.

Puoi provare questo, sovraccaricando la funzione.

 [OperationContract] MyResponse GetData(); [OperationContract(Name = "GetDataByFilter")] MyResponse GetData(string filter); 

Quindi un’altra opzione consiste nell’utilizzare un DataContract anziché in più parametri e impostare IsRequired su false sui DataMember appropriati, come spiegato in questa domanda .

Faccio il compilatore lamentarsi e piangere su nessun metodo con la firma di un singolo parametro.

Inizia dall’inizio. Che il tuo compilatore “si lamenta” è perché il servizio non riconosce i parametri opzionali con i valori predefiniti, quindi esporrà il metodo che richiede tutti i parametri. Sulla base di questi metadati, si genera un proxy client (“Riferimento di servizio”), che non contiene il metodo previsto; vede solo il metodo esposto dal servizio: quello con la firma (String beep, String boop) . Ecco perché, alla fine, ricevi un errore di compilazione quando provi a chiamare un metodo non esistente su una class.

Ora quando chiami questo metodo sul servizio, il tuo cliente dovrà fornire entrambi i valori. Se si fornisce null , il servizio vedrà null , poiché i valori per i parametri predefiniti devono essere compilati nel chiamante. WCF non lo supporta, quindi dovrai solo creare sovraccarichi come suggerito da @StephenBorg.

Puoi farlo in questo modo:

 [DataContract] public class GetStuffParams { [DataMember] string beep {get; set; } [DataMember] string boop {get; set;} public GetStuffParams() { boop = "too lazy to type"; } } [OperationContract] [WebGet] String GetStuff(GetStuffParams stuffParams); 

dovresti controllare il codice generato quando aggiungi il riferimento al servizio.

come il codice viene generato da WISDL, dove la firma è (pseudo):

 GetStuff(String , String ) 

genera il codice di conseguenza, non conoscendo i parametri opzionali. quindi, se vuoi diventare pigro, dovresti modificare la class proxy generata o, come suggerito da @Stephen Borg, sovraccaricare la funzione.