6

Windows フォーム アプリケーション (両方とも .NET、両方とも同じソリューション内) から呼び出している Web サービスがあり、Web サービスがプロジェクトの他の場所からカスタム オブジェクトを返すようにしたいと考えています。私のソリューションの 3 番目のプロジェクトにあるため、どちらも参照を共有しています。Web サービスを呼び出すと、"Person" オブジェクトが返されますが、これは Web サービスの名前空間にあり、Web サービス自体が生成したプロキシ クラスから作成されます。そのため、それを操作して、webservice 名前空間からのプロキシ コピーではなく、クラスの共有コピーに基づく "Person" オブジェクトを期待しているプログラムに返すことができず、試してみるとエラーが発生します。正しいクラス型に CType します。

プロキシ コピーではなく、クラスのローカル コピーを使用するよう Web サービスに強制するにはどうすればよいですか? この文脈で私の質問は意味がありますか? そうでない場合は、明確にします。

注 - すべてのパラメーターを ByRef に渡し、返された値を使用して、返されたときに作成したオブジェクトのコピーを作成することにしました。これは最善の方法ではありません。

4

3 に答える 3

3

svcutil.exe を使用して WCF クライアント プロキシを生成する場合は、コマンド ラインで /reference を使用して、共通クラスを含むアセンブリを指定できます。Svcutil は、サービス プロキシ名前空間で新しいクラス定義を生成するのではなく、そのクラス定義を再利用する必要があります。

また、これは、共通クラスがシリアル化可能で、値で渡される (つまり、サービス コントラクトとしてではなく、データ コントラクトとして公開されている) 場合にのみ機能します。

于 2008-10-19T20:26:49.953 に答える
2

WCF を使用している場合、クライアントとコンシューマーの間で同じデータ コントラクトとサービス インターフェイスを使用するのは非常に簡単です。生成されたプロキシ クラスでコンパイルし、正しい名前空間を使用するように変更するか、ChannelFactoryクラスを使用して動的プロキシを作成することができます。

最初の解決策は非常に脆く、サービス インターフェイスが変更されるたびにプロキシ クラスを変更する必要があります。2 番目の手法はかなりうまく機能し、私が取り組んだ以前のプロジェクトで使用しました。これらの方法のいずれかを使用すると、すべての発信者が引き続き最新バージョンのインターフェイスで最新であることを確認する必要があります。

問題を説明している方法から、サービスとクライアントが同じインスタンスを共有するように思えます。WCF では、型をサービスとの間で送受信するときに型をシリアル化および逆シリアル化するため、もう少し巧妙なことを行う必要があります。これはあなたが意味したものですか?

于 2008-10-19T20:32:31.017 に答える
0

よくわかりませんが、.NET Web サービスをコンパイルすると、DLL ファイルが作成され、それをローカルで使用してみることができます。しかし、サービス指向のアプリケーションを構築するときは、ソリューション内にデータ アクセス レイヤー、ロジック レイヤー、サービス レイヤー、UI レイヤー、コントローラー レイヤーなどのさまざまなレイヤーを作成します。たとえば、コントローラー レイヤーではユーザー認証方法を実行します。データ アクセス レイヤーとロジック レイヤーに接続し、そのメソッドをサービス レイヤーで呼び出します。また、UI レイヤーで呼び出すこともできます。UI レイヤー内から呼び出すと、使用したいときにローカルで呼び出されます。サービス層から、bool やユーザー名などを返すメソッドを使用して Web メソッドを作成します。

于 2008-10-19T20:03:31.903 に答える