プロキシクラスではなくローカルオブジェクトクラスを使用するように.NET Webサービスを強制する

StackOverflow https://stackoverflow.com/questions/216884

質問

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

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

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

役に立ちましたか?

解決

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

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

他のヒント

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

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

問題の説明からすると、サービスとクライアントが同じインスタンスを共有するように思えます。 WCFは、サービスとやり取りするときに型をシリアル化および逆シリアル化するため、もう少し賢い操作を行う必要があります。これはあなたの意図ですか?

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top