2

任意の数の文字列パラメーターを渡すことができる OperationContract を定義したいと思います。値は、文字列の配列として解釈する必要があります。このタイプのパラメーターを OperationContract で使用し、これを UriTemplate で定義する可能性はありますか?

[ServiceContract]
public interface IRestService {
    [OperationContract]
    [WebGet(UriTemplate = "operations/{values}")]
    void Operations(params string[] values);
}
4

3 に答える 3

2

GET 操作ではこれを行うべきではありません。GET 操作は、パスまたはクエリ文字列のパラメーターのみをサポートします。どちらも、コレクションなどの複雑な型には適していません。

コレクションは、POST 操作を使用して body パラメーターとして渡す必要があります。

[OperationContract]
[WebInvoke(Method = "POST", 
           RequestFormat = WebMessageFormat.Json, // or xml
           UriTemplate = "operations/xAllTheStrings")]
void Operations(string[] values);
于 2016-07-19T08:30:50.323 に答える
1

いいえ、ただし、便宜上、プロキシおよび/またはサービス コントラクトに (拡張) メソッドを作成して、params string arrayパラメーターを公開し、それを実際のプロキシ/サービス コントラクトに として渡すことができますstring array

于 2016-07-19T08:15:53.903 に答える
1

サービス コントラクト インターフェイスはまさにそれです。サーバーが受け入れるものと、クライアントが遵守する必要があるものとの間の正式な契約です。このコントラクトは、wsdl の形式で XML にシリアル化されます。そのため、コントラクトに表示されるすべてのデータ型は、XML のシリアル化された形式で表現できる必要があります。

あなたの場合、サービス呼び出しへの引数の数は明確に定義されていません。0、1、2... などの可能性があります。サービス指向のテナントの 1 つは、契約が明示的である必要があることです。ではありません。

最も「慣用的な」アプローチ (サービス指向のコンテキスト内) は次のとおりです。

[ServiceContract]
public interface IRestService {
    [OperationContract]
    [WebGet(UriTemplate = "operations/{values}")]
    void Operations(string[] values);
}

この回答で示唆されているように、クライアント側に構文糖衣を追加したい場合は、キーワードを使用してクライアント側のエクスペリエンスを消化paramsやすくする拡張メソッドを作成できます。

編集:

Tomが指摘したように、上記のコントラクトは機能しません。操作を POST に変更するか ( Tom's answerで示されているように)、サーバー側で解読して配列を生成する区切り記号の引数文字列を作成する必要があります。

[ServiceContract]
public interface IRestService {
    [OperationContract]
    [WebGet(UriTemplate = "operations/{delimitedValues}")]
    void Operations(string delimitedValues);
}
于 2016-07-19T08:39:13.013 に答える