11

私はまだASP.NETの世界に慣れていないので、ここではベースから離れている可能性がありますが、これまでのところ、これは私の(限られた)知識の範囲内です!

Business名前空間に標準のビジネスオブジェクト「Contact」があるとします。データベースから連絡先の情報を取得して返すWebサービスを作成します。次に、クライアントアプリケーションを作成して、上記の詳細を要求します。

次に、「連絡先」を取得して、たとえば、それを使って魔法をかけるユーティリティメソッドも作成しますUtils.BuyContactNewHat()。もちろん、これはタイプの連絡先を取りますBusiness.Contact

次に、クライアントアプリケーションに戻り、メソッドを利用したいので、 Utils名前空間BuyContactNewHatへの参照を追加します。ただし、次の問題が発生します。

Contact c = MyWebService.GetContact("Rob);
Utils.BuyContactNewHat(c); // << Error Here

のリターンタイプGetContactはのでMyWebService.Contactあり、期待どおりではないBusiness.Contactため。これは、Webサービスにアクセスするときに、WSDLによって生成されたプロキシクラスに対して実際にプログラミングしているためです。

それで、このタイプのミスマッチに対処するための「より簡単な」方法はありますか?おそらく、リフレクションを使用して、値を一方から他方に単純に転送するのではなく、2つのオブジェクトが同じ構造を持つようにする汎用コンバータークラスを作成しようと考えていました。

4

3 に答える 3

5

あなたは正しい方向に進んでいます。プロキシオブジェクトから独自のオブジェクトの1つにデータを戻すには、左辺から右辺のコードを実行する必要があります。つまり、プロパティ値をコピーします。リフレクションを使用する一般的なメソッドがすでに存在していることは間違いありません。

ビジネスオブジェクトをネットワーク経由で取得したいだけの場合は、Webサービス(.net remoting)以外のものを使用する人もいます。または、バイナリシリアル化を使用します。なんらかの理由でWebサービスを利用していると思いますので、プロパティのコピーが必要になります。

于 2008-08-09T08:58:24.707 に答える
3

WSDLが提供する生成されたクラスを実際に使用する必要はありません。生成されるコードを見ると、SOAPリクエストを送信するためにいくつかの.NETFrameworkクラスを呼び出しているだけです。過去に、私はそのコードを通常の.csファイルにコピーして編集しました。これを具体的に試したことはありませんが、プロキシクラス定義を削除して元のクラスを使用してSOAP呼び出しの結果を受け取ることができなかった理由はわかりません。それはすでにボンネットの下で反射をしているに違いありません、それを二度行うのは残念なようです。

于 2008-08-11T18:07:11.820 に答える
1

プロキシ コードの生成を制御するために使用できる Schema Importer Extension の作成を検討することをお勧めします。このアプローチを使用すると、(ある名前空間から別の名前空間にオブジェクトをコピーしたり、プロキシによって生成された reference.cs クラスのみを変更して、次に Web 参照を更新したときに置き換えられるようにするなど)、手間をかけずに問題を (優雅に) 解決できます。

これは、この件に関する(非常に)優れたチュートリアルです。

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx

于 2008-12-27T18:35:48.427 に答える