2011-09-16 9 views
2

C#でリモート処理を使用すると、別のサーバーに接続しています。私はクライアント側で機能を追加し続けているので、サーバー側のサービスは常に最新ではありません。C#VSのバージョン管理でリモート化

インターフェイスでメソッドを呼び出すと(サーバーでメソッドをリモートから呼び出す)、このメソッドがサーバー側の実装に存在しないという問題を解決するにはどうすればよいですか?

私は捕まえられない例外があるので、クライアントは自然にクラッシュします。はい、私は可能ですが、私はこのように呼び出すメソッドが多いので、それぞれの例外処理を追加するのは辛いでしょう。

「解決策」の1つは、私のMarshalByRefObjectの各メソッドにカスタムバージョン属性を入れることでした。しかし、後でそれぞれのメソッドを呼び出す際にどのように使用するのか分かりません。注釈/属性を各メソッドに追加しても構いませんが、バージョンが十分に新しくなったかどうかを尋ねるifステートメントを持つのは苦痛です。

私が考えた別の方法は、これを継承することでした。

public abstract class AbstractServer1 : MarshalByRefObject 
{ 
    public abstract void feature1(); 
} 

public abstract class AbstractServer2 : AbstractServer1 
{ 
    public abstract featureInVersion2(); 
    public abstract string reallyNewFeature(); 
} 

public class ServerClass1 : AbstractServer1 
{ 
    public void feature1(); 
} 

public class ServerClass2 : ServerClass1, AbstractServer2 
{ 
    public void featureInVersion2(); 
    public string reallyNewFeature(); 
} 

しかし、これは次のようになります:

public AbstractServer getRemoteObject(string host, int port) 
{ 
    object obj = Activator.GetObject(typeof(AbstractServer2), "tcp://" + host + ":" + port.ToString() + "/ServiceName"); 
    if (typeof(obj) == ServerClass1) 
    { 
     ... 
    } 
} 

そして、これはどちらも美しいもなく、それは本当に動作しません。

良い解決策がありますか?

備考:サーバーとクライアントで同じアセンブリファイルを使用することは、残念なことにオプションではありません。

何か助けていただければ幸いです。

+2

は、あなたがそのRemotingを知っていました(VOID-戻っていないなどのエラー時に例外を再スローし、ヌル-if機能を返さない)あなたが望む行動の種類を持っているために、このクラスビットを書き換えることができWCFを支持して廃止されましたか? .NET 3.0以来? –

+0

@ジョン:あなたの速い返答をありがとう。うーん、私はしませんでした:P Okay ...ちょうどMSDN(http://msdn.microsoft.com/en-us/library/ms734712.aspx)のチュートリアルを見て、私はそれを取得していない場合完全に間違って、私の問題はWCFでも同じになります。何か不足していますか? – Atmocreations

+0

クライアント側またはサーバー側の例外ですか?例外にはアセンブリ解決エラーが含まれますか? – Seb

答えて

1

サーバサイドに存在しない関数を呼び出すと、どのような動作が期待できますか?

This code might be usefull to you

これは、特定のインタフェースを実装するオブジェクトのメンバーを呼び出したときに発生したすべての例外をキャッチプロキシを構築します。 これは、wpfチャネルまたはRemotingプロキシのインターフェイスメンバーで使用できます。

IMyInterface myService = [...]; 
IMyInterface myExceptionLoggedService = ExceptionProxyGenerator.Generate<IMyInterface>(myService); 
(myExceptionLoggedService as IExceptionProxy).Error+=(sender,method,exception)=>{ 
    // do what you want on exception 
}; 
// Use my service : 
myExceptionLoggedService.MyExistingFunction();// ok 
myExceptionLoggedService.MyNotExistingFunction();// calling the above delegate 

あなたは

関連する問題