2013-06-11 4 views
14

私のインターフェイスで私はこれを宣言しました。WCFのインターフェイスを実装するときにオプションのパラメータを使用できません

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

次のように実装しました。

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

コンパイルして私のWCFサービスとしてアップロードします。しかし、私はそれをWeb参照として使用し、以下のコードを実行しようとすると、コンパイラは単一のパラメータのシグネチャを持つメソッドについて泣いたり泣いたりします。最後の行が問題です。

どのようにすることができます入力するには怠け者

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

理由だけではなく、メソッドをオーバーロードし、一つの方法は、付属の「ブープ」と相手を呼び出すことはありませ? – Kippie

+3

WCFでオーバーロードが機能しません。 –

+0

@HenkHolterman多くの良い返信がここにあります。あなたは良いと思って、あなたの簡単な説明を答えに入れて、私はそれを緑色にチェックしてください。 "Def args not supported"は私の問題に対する最良の答えです。 :) –

答えて

24

単純に:デフォルトの引数はサポートされていません。

設計上および理由があります。私たちはWCF契約を書くのにC#を使いますが、これは表記法です。すべてのC#言語機能をSOAP、REST、またはJSonで実装できるわけではありません。

14

この機能をオーバーロードすると、これを試すことができます。

[OperationContract] 
MyResponse GetData(); 

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

そして別のオプションではなく、複数のパラメータのDataContractを使用し、this questionで説明したように、適切なDataMember S上falseにIsRequiredを設定することです。

1

あなたはサービス参照を追加する際に生成されたコードをチェックアウトする必要があります。コード署名であるWISDL、(擬似)から生成される

​​

それはオプションのパラメータについて知らず、それに応じてコードを生成します。ですから、怠け者になってもらうには、生成されたプロキシクラスを変更するか、@Stephen Borgが示唆するように、関数のオーバーロードを行うべきです。

3

私は、コンパイラは泣き言と、単一のパラメータの署名のある方法について泣きながら取得します。冒頭に

スタート。あなたのコンパイラは、サービスがデフォルトの値を持つオプションのパラメータを認識しないため、すべてのパラメータを必要とするメソッドを公開するだけなので、コンパイラが "うわー"と言います。このメタデータに基づいて、クライアントプロキシ(「サービス参照」)が生成されます。これには、期待する方法も含まれていません。それは、サービスが公開するメソッド、すなわち、(String beep, String boop)署名を持つメソッドしか見ることができません。そのため、クラス上に存在しないメソッドを呼び出そうとすると、最終的にコンパイルエラーが発生します。あなたがサービスでこのメソッドを呼び出すとき

は今、あなたのクライアントは、両方の値を提供する必要があります。 nullを指定すると、デフォルトパラメータの値を呼び出し側にコンパイルする必要があるため、サービスにはnullが表示されます。 WCFはそれをサポートしていないので、@StephenBorgが提案するようにオーバーロードを作成するだけで済みます。

3

あなたはこのようにそれを行うことができます。

[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); 
関連する問題