私のインターフェースでこれを宣言しました。
[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");
簡単に言うと、デフォルトの引数はサポートされていません。
設計上および理由付き。 C#を使用してWCFコントラクトを記述しますが、これは表記上のトリックです。すべてのC#言語機能をSOAP、REST、またはJSon)で実装できるわけではありません。
関数をオーバーロードして、これを試すことができます。
[OperationContract]
MyResponse GetData();
[OperationContract(Name = "GetDataByFilter")]
MyResponse GetData(string filter);
次に、別のオプションは、複数のパラメーターの代わりにDataContract
を使用し、 この質問 で説明されているように、適切なIsRequired
sでDataMember
をfalseに設定することです。 。
あなたはこのようにそれを行うことができます:
[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);
コンパイラーが、単一のパラメーターの署名を持つメソッドがないことについて泣き叫びます。
最初から始めます。コンパイラが「泣き言」を言うのは、サービスがデフォルト値のオプションパラメータを認識しないため、すべてのパラメータを必要とするメソッドを公開するだけだからです。このメタデータに基づいて、クライアントプロキシ(「サービスリファレンス」)を生成します。これには、期待するメソッドも含まれていません。サービスが公開するメソッド、つまり(String beep, String boop)
シグネチャを持つメソッドのみが表示されます。そのため、クラスで存在しないメソッドを呼び出そうとすると、最終的にコンパイルエラーが発生します。
これで、サービスでこのメソッドを呼び出すときに、クライアントは両方の値を提供する必要があります。 null
を指定すると、デフォルトのパラメーターの値を呼び出し元にコンパイルする必要があるため、サービスにはnull
が表示されます。 WCFはこれをサポートしていないため、@ StephenBorgが提案したようにオーバーロードを作成する必要があります。
サービス参照を追加するときに生成されるコードを確認する必要があります。
コードはWISDLから生成されるため、署名は(疑似)です。
GetStuff(String , String )
オプションのパラメータを知らずに、それに応じてコードを生成します。したがって、怠惰になりたい場合は、生成されたプロキシクラスを変更するか、@ Stephen Borgが提案したように、関数をオーバーロードする必要があります。