gpt4 book ai didi

c# - C# 中的远程处理 VS 版本控制

转载 作者:太空宇宙 更新时间:2023-11-03 14:12:24 25 4
gpt4 key购买 nike

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

如果我在我的接口(interface)中调用一个方法(它在服务器上远程调用该方法)并且该方法在服务器端的实现中不存在,我该如何解决?

客户端自然会崩溃,因为有一个我无法捕获的异常。是的,我可以,但是由于有许多不同的方法我用这种方式调用,所以为每个方法添加异常处理会很痛苦。

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

而且这既不美观也不实用。

有好的解决办法吗?

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

感谢任何帮助。

最佳答案

当调用服务器端不存在的函数时,您期望什么样的行为?

This code might be usefull to you

它构建了一个代理,它捕获在调用实现特定接口(interface)的对象的成员时发生的每个异常。您可以在 wpf channel 或远程处理代理的接口(interface)成员上使用它。

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 - 如果函数不返回 void-)

关于c# - C# 中的远程处理 VS 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7441294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com