在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)
{
...
}
}
这既不美观也不真实。
这有一个很好的解决方案吗?
备注:遗憾的是,在服务器和客户端中使用相同的程序集文件不是一种选择。
感谢任何帮助。
答案 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 - )