簡體   English   中英

在C#VS版本中進行遠程處理

[英]Remoting in C# VS versioning

在C#中使用遠程處理,我正在連接到其他服務器。 當我在客戶端不斷添加功能時,服務器端的服務並不總是最新的。

如果我在接口中調用一個方法(該方法在服務器上遠程調用該方法)而該方法在服務器端的實現中不存在,該如何解決呢?

客戶端自然崩潰,因為有一個我無法捕獲的異常。 是的,我可以,但是由於我用這種方法調用了許多不同的方法,因此為每個方法添加異常處理將很痛苦。

我堅決提出的“解決方案”是在我的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)
    {
        ...
    }
}

這既不美觀也不起作用。

有一個好的解決方案嗎?

備注:不幸的是,不能在服務器和客戶端中使用相同的程序集文件。

任何幫助表示贊賞。

調用服務器端不存在的函數時,您期望什么樣的行為?

此代碼可能對您有用

它構建一個代理,以捕獲調用實現特定接口的對象的成員時發生的所有異常。 您可以在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

您可以重寫此類以使其具有所需的行為(例如不將錯誤拋出異常並返回null -if函數未返回void-)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM