2012-07-02 10 views
9

次のように私の契約が見える場合:WCF Webサービスで戻り値のパラメータが終了するのを防ぐにはどうすればよいですか?

[OperationContract] 
void DoSomething(int id, out string moreInfo); 

これは、ように見える終わる:あなたは、Webサービス参照をインポートするとき

string DoSomething(int id); 

。パラメータの順序の自動変換に影響を与えることは可能ですか?関数のシグネチャの冒頭にすべてのoutパラメータを見つけることは、すでに驚くべきことでしたが、それでも実行可能でしたが、voidメソッドがvoidメソッドであり続けることを望みます。またはこれはSOAPの制限ですか?

+1

この例では、単一の 'out'パラメータを持つvoidメソッドは事実上、正しい戻り値を持つ非voidメソッドです。 'out'パラメータを定義すると、非出力バージョンはあなたに与えられないのですか? –

+0

@AdamWebサービスの設計において、直交性は高くなっています。もともと私たちは価値を返すサービスと、価値のないサービスを持っていました。しかし、各サービスは状態を返すようにリファクタリングされました。追加のparamを強制することで、ビルドは自動的に失敗し、どこを修正するかを知ることができます。また、残りの契約に関係なく、最初のパラメータがステータスを含むout-paramであることを常に知っておくと便利です。 – Abel

+3

私は実際には非常に驚いていて、WCFがその操作のプロキシをまったく生成できたことに感銘しました!最初に 'out'パラメータを使用する根拠は何ですか? – MattDavey

答えて

4

WSDLの制限に基づいているように見える: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/48b5992f-f7bd-4b67-8299-514d1780fa9a

WSDLは、元のメソッドのシグネチャを示していません。代わりに、入力パラメータをグループとして 、出力パラメータを別のグループ として表示します。

戻り値を出力パラメータから分離できないという制限は、WSDLにあります。しかし、それはvoidメソッドの制限がsvcutil.exeの一部となることを意味します。最初の出力を戻り値に移動しないようにsvcutilに切り替えることができない理由はありませんが、これはms connectの機能に対する要求になります。

問題が一貫していれば、単純なステータスintまたはboolを返すことができますが、すでに数十ものメソッドがある場合は完璧な答えではないと確信しています。

+1

私は数分前に同じリンクで起こった。実際、それは基盤となるWSDLの限界です。ラッパーは、もちろん、任意の順序を使用することができますが、私はそれを強制するためのユースケースを見ません。この制限を回避するために、少なくともVoidResponse型を使用して、当面はリファクタリングを容易にします。 – Abel

+0

VoidResponseタイプの良いアイデアです。 –

関連する問題