在C#VS版本控制中远程处理

时间:2011-09-16 07:10:25

标签: c# versioning remoting

在C#中使用Remoting,我正在连接到不同的服务器。由于我在客户端不断添加功能,服务器端的服务并不总是最新的。

如果我在我的界面中调用一个方法(在服务器上远程调用该方法)并且在服务器端的实现中不存在这个方法,我怎么能解决这个问题呢?

客户端自然崩溃,因为我无法捕捉到异常。是的,我可以,但由于有许多不同的方法,我这样称呼,为每个方法添加异常处理会很痛苦。

我想要的一个“解决方案”是为我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)
    {
        ...
    }
}

这既不美观也不真实。

这有一个很好的解决方案吗?

备注:遗憾的是,在服务器和客户端中使用相同的程序集文件不是一种选择。

感谢任何帮助。

1 个答案:

答案 0 :(得分: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

你可以重写一下这个类,以获得你想要的那种行为(比如不要在错误时重新抛出异常并返回null -if函数不返回void - )