14

私のインターフェースでは、これを宣言しました。

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

5 に答える 5

14

関数をオーバーロードして、これを試すことができます。

[OperationContract]
MyResponse GetData(); 

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

別のオプションは、この質問で説明されているようDataContractに、複数のパラメーターの代わりにa を使用IsRequiredし、適切な s で false に設定することです。DataMember

于 2013-06-11T11:45:39.760 に答える
3

単一のパラメーターのシグネチャを持つメソッドがないことについて、コンパイラーが泣き言を言ったり泣いたりします。

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

サービスでこのメソッドを呼び出すと、クライアントは両方の値を提供する必要があります。を指定すると、デフォルト パラメータの値を呼び出し元にコンパイルする必要があるため、nullサービスは を参照します。nullWCF はそれをサポートしていないため、@StephenBorg が提案したようにオーバーロードを作成する必要があります。

于 2013-06-11T11:51:13.897 に答える
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);
于 2014-07-11T07:04:44.763 に答える
1

サービス参照を追加するときに生成されたコードを確認する必要があります。

コードは WISDL から生成されるため、署名は (疑似):

GetStuff(String , String )

オプションのパラメーターについては知らずに、それに応じてコードを生成します。したがって、怠惰になりたい場合は、生成されたプロキシクラスを変更するか、@Stephen Borg が提案したように、関数をオーバーロードする必要があります。

于 2013-06-11T11:50:38.790 に答える