0

クライアント プロキシ クラスを生成する必要があるライブラリがあり、ローカル ボックスでこのコマンドとサービスを実行すると、既存のコードが正常に動作します。

svcutil.exe /config:thn /r:Citi.Rbcs.BusGn.dll /r:Citi.Rbcs.Buscm.dll net.tcp://localhost:8088/RbcThnService/mex

クライアント プロキシは正常に生成されます。RbcThnService はインターフェイス IRbcThinService を使用します。次に、次のようにそのインターフェイスに新しいメソッドを追加すると

[OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
        [FaultContract(typeof (GenericException))]
        [FaultContract(typeof (CustomException))]
        RbcCustomerStructure GetCustomerStructures(string CustomerId, short QueueId, DateTime dateUpdate, RbcSecurityContext securityContext);

次に、サービスを再構築してインストールし、クライアント プロキシを再生成しようとすると、

There is an error in the XML document.

The value for the 'type' attribute is invalid - 'q32:ArrayOfstring' is an invalid value for the 'type' attribute.

宣言で特定の型が見つからないように聞こえますが、奇妙なことに、インターフェイスには元のライブラリとまったく同じ署名を持つ別のメソッドがあり、クライアント プロキシが問題なく生成できるようになっています。したがって、既存のメソッドと同じメソッドを新しい名前で作成しているだけです。

誰か提案はありますか?

更新: 既存のメソッドの 1 つでもコメントアウトして再試行すると、プロットが厚くなります。新しいメソッドで動作します。ほんの一握りのメソッドと新しいメソッドにそれを取り除いてみましたが、うまくいきます。他の方法を1つずつ徐々に再導入しましたが、最後の方法を追加するまで機能し続け、エラーが発生しました。

興味深いことに、元のメソッドの 1 つをコメントアウトし、それが機能するようになりました。次に、2 番目のダミーの NEW メソッドを作成しましたが、同じエラーが発生しましたが、ArrayOfstring の代わりに別の型が原因で失敗していました。

したがって、間違ったツリーを鳴らしていない場合は、インターフェース定義にあるメソッドの数、または生成された XML の長さに関係しているようです。注意すべき制限はありますか?

4

1 に答える 1

0

どのタイプの Web サービスでも、オーバーロードされたメソッドを持つことはできません。別の OperationContract Name EG を指定すると、WCF はこれを許可します。

[ServiceContract]
interface IService
{
    [OperationContract(Name="Foo")]
    void Foo();

    [OperationContract(Name="Foobar")]
    void Foo(string bar);

}

しかし、これは基本的に公開署名をメソッドに変更することであり、インターフェイスで同じ名前が付けられていても、クライアントを作成するときに混乱する可能性があるため、通常はこれを行いません。

同様の問題については、この投稿を確認してください。Web サービス (WCF を含む) では、オーバーロードされた (同じ名前の) メソッドは、何を呼び出しているかを理解することは文字通り不可能です。OperationContract のメソッド名または Name 属性を別のものに変更して、再試行してください。

于 2012-10-18T13:33:19.817 に答える