Удаленное управление версиями в C # VS - PullRequest
2 голосов
/ 16 сентября 2011

Используя Remoting в 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)
    {
        ...
    }
}

И это не красиво и не работает.

Есть хорошее решение для этого?

Примечание: использование одного и того же файла сборки на сервере и клиенте, к сожалению, НЕ вариант.

Любая помощь приветствуется.

1 Ответ

1 голос
/ 16 сентября 2011

Какое поведение вы ожидаете при вызове функции, которая не существует на стороне сервера?

Этот код может быть вам полезен

Он создает прокси, который перехватывает все исключения, возникающие при вызове членов объекта, реализующего определенный интерфейс. Вы можете использовать это на каналах wpf или на интерфейсных элементах ваших удаленных прокси.

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

Вы можете немного переписать этот класс, чтобы получить желаемое поведение (например, не выбрасывать исключение при ошибке и возвращать нулевую функцию -if, не возвращая void -)

...