web-dev-qa-db-ja.com

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");
14

簡単に言うと、デフォルトの引数はサポートされていません。

設計上および理由付き。 C#を使用してWCFコントラクトを記述しますが、これは表記上のトリックです。すべてのC#言語機能をSOAP、REST、またはJSon)で実装できるわけではありません。

24
Henk Holterman

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

[OperationContract]
MyResponse GetData(); 

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

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

14
Mez

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

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

コンパイラーが、単一のパラメーターの署名を持つメソッドがないことについて泣き叫びます。

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

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

3
CodeCaster

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

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

GetStuff(String , String )

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

1
Igarioshka