4

VS2010 と .NET 4.0 を使用しています。

ここで確認しました ( WCF サービスに実装されているインターフェイスの共有) が、達成しようとしているものがServiceContractでマークされたインターフェイスを含むという点で異なります。

つまり、サービスには、インターフェース A (ServiceContract としてマーク) と拡張インターフェース B (同じく ServiceContract としてマーク) があります。B は、WCF サービスによって実装されます。

正確な拡張子は次のようになります。

public interface A<T>

public interface B : A<SpecificType>

(「SpecificType」は DataContract としてマークされます。)

明らかに、B はプロキシ生成プロセスで WCF クライアントに公開されます。ただし、インターフェイス A も公開する必要があります (半汎用のパブ/サブシステムを実装しており、「パブリッシャー」はインターフェイス A をチェック/依存できる必要があります)。

これを解決しようとした最初の方法は、インターフェイスを含み、サービスとクライアントの両方で使用できる別の「共有」アセンブリを作成することでした。ただし、パブリッシャーでは、B のインスタンスが実際に A から適切に拡張されていることを確認する必要があるため、これはうまく機能しませんでした。この暗黙の変換は失敗します。 「共有」アセンブリとジャイブします。

これを回避するために、Reference.cs ファイルを手動で編集したところ、機能するようになりました (インターフェイス A の定義を追加し、インターフェイス B が適切に参照されるようにしました)。しかし、これはサービス参照を更新するたびにこのコードが消えてしまうという大きな問題を引き起こします。

このサイトや他のサイトで他の WCF の回答を見ても、正確な回答を見つけることができないようです (おそらく、すべての回答とその回答を確認できていないだけかもしれません)。

誰かが私を正しい方向に向けることができれば、私はそれを感謝します.

ありがとう。

4

1 に答える 1

3

クライアントに「生の」サービス コントラクト インターフェイスへのアクセスを提供します (アセンブリまたは .cs ファイルへのリンク)。次に、2 つのオプションがあります。

1) 自動生成されたプロキシ呼び出しを独自のクラス メソッド呼び出しにラップします (必要に応じてインターフェイスを実装します)。サービス リファレンスを更新しても問題はありません。

2) 自動生成されたプロキシを使用しないでください。独自のプロキシを作成します (インターフェースを実装します):

var baseAddress = "net.tcp://localhost:4503/MyService"; 
var channelFactory = new DuplexChannelFactory<IMyService>(new InstanceContext(new MyNotificationReceiver()), //MyNotificationReceiver - WCF callback implementation class
    myNetTcpBinding,
    new EndpointAddress(baseAddress));

var proxy = channelFactory.CreateChannel();
proxy.MyMethod();
于 2013-03-03T17:45:15.717 に答える