2013-06-11 7 views
14

In meiner Schnittstelle habe ich dies deklariert.Kann optionale Parameter bei der Implementierung einer Schnittstelle für eine WCF nicht verwenden

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

Ich implementierte es wie folgt.

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

Es kompiliert und lädt als meine WCF-Dienst. Wenn ich es jedoch als Web-Referenz verwende und versuche, den unten stehenden Code auszuführen, lasse ich den Compiler über keine Methode mit der Signatur eines einzelnen Parameters winseln und weinen. Die letzte Zeile ist das Problem.

Wie kann ich dann zu faul sein, umstandardmäßig einzugeben?

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

Warum nicht einfach die Methode überlastet, und eine Methode, um die andere mit „boop“ Bestellformulare nennen? – Kippie

+3

Überladung funktioniert nicht mit WCF. –

+0

@HenkHolterman Viele gute Antworten hier. Würdest du gut sein und deine einfache Erklärung als Antwort geben, damit ich sie grün überprüfen kann, bitte. "Def args not supported" ist die beste Antwort auf mein Problem. :) –

Antwort

24

Einfach: Standardargumente werden nicht unterstützt.

Mit Absicht und mit Grund. Wir verwenden C#, um WCF-Verträge zu schreiben, aber das ist ein Notfallstrick. Nicht jede C# -Sprache kann in SOAP, REST oder JSon implementiert werden.

14

Sie können dies versuchen, die Funktion überladen.

[OperationContract] 
MyResponse GetData(); 

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

Dann eine weitere Option ist es, eine DataContract statt mehrerer Parameter zu verwenden, und setzen IsRequired auf falsch auf die entsprechenden DataMember s, wie in this question erklärt.

1

sollten Sie den Code überprüfen, der beim Hinzufügen der Service-Referenz generiert wird.

als der Code von WISDL erzeugt wird, wo die Signatur (pseudo):

GetStuff(String , String) 

es den Code entsprechend erzeugt, nicht über die optionalen Parameter zu kennen. Wenn Sie also faul werden wollen, sollten Sie die erzeugte Proxy-Klasse ändern oder, wie @ Stephen Borg vorgeschlagen hat, die Funktion überladen.

3

Ich bekomme den Compiler winseln und weinen über keine Methode mit der Signatur eines einzelnen Parameters.

Beginnen Sie am Anfang. Dass Ihr Compiler "winselt", liegt daran, dass der Dienst optionale Parameter nicht mit Standardwerten erkennt. Daher wird nur die Methode angezeigt, die alle Parameter erfordert. Basierend auf diesen Metadaten generieren Sie einen Client-Proxy ("Service Reference"), der auch nicht die von Ihnen erwartete Methode enthält; Es sieht nur die Methode, die der Dienst verfügbar macht: die mit der Signatur (String beep, String boop). Aus diesem Grund erhalten Sie am Ende einen Kompilierfehler, wenn Sie versuchen, eine nicht existierende Methode für eine Klasse aufzurufen.

Wenn Sie diese Methode jetzt für den Dienst aufrufen, muss Ihr Client beide Werte angeben. Wenn Sie null angeben, wird der Dienst null angezeigt, da die Werte für die Standardparameter in den Aufrufer kompiliert werden müssen. WCF unterstützt das nicht, also müssen Sie nur Überladungen erstellen, wie @StephenBorg vorgeschlagen hat.

3

Sie können es wie folgt tun:

[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);