Как прокси-удаленно .NET IEnumerable с пакетами фиксированного размера по сети? - PullRequest
5 голосов
/ 17 декабря 2010

.NET remoting может генерировать прозрачные прокси-пульты для интерфейса с сериализуемыми членами, такими как:

public interface INetworkInterface {
  bool login(string username, string password);
  bool ExecuteSomething(string command);
}

Я хотел бы предоставить собственный сериализатор и активный прокси-удаленный модуль для любого возврата IEnumerator<T>результат.Мой пользовательский удаленный прокси-сервер будет обрабатывать определенное количество элементов за раз по сети.Например, учитывая следующий интерфейс:

public interface INetworkInterface2 {
    IEnumerable<string> ExecuteSomething(string command);
}

Я хотел бы предоставить настраиваемый сериализатор И прокси, который автоматически используется каждый раз, когда IEnumerator<T> where T:ISerializable появляется в удаленном интерфейсе, и сериализует IEnumerator<string> вна стороне клиента EnumeratorBatchHandlerClient<string> с удаленным прокси .NET на стороне сервера EnumeratorBatchHandlerServer<string>.

Я думаю, что клиент-пакетный обработчик будет выглядеть примерно так:

class EnumeratorBatchHandlerClient<T> : IEnumerable<T> {
    List<T> batched_results = new List<T>();
    EnumerableBatchHandlerServer server_proxy;    
    T cur = null;
    bool MoveNext() {
      if (batched_results.Count == 0) {
          batched_results = server_proxy.getNextBatch().ToList();
          if (batched_results.Count == 0) {
            return false;  // we are really out of results
          }
      } 
      cur = batched_results[0]; batched_results.RemoveAt(0);
      return true;
    }
    public T Current {  get { return cur; } }

}

Есть ли способ заставить .NET Remoting прозрачно создавать и связывать мой пользовательский клиент / сервер"ienumerable batch proxy", когда IEnumerable появляется в прокси-интерфейсе?

Обновление : Одна хитрая идея, которая у меня была для этого, заключалась в том, чтобы создать RealProxy, который бы выполнял работу по вставке заглушек, и прикрепил ее перед моим удаленным классом.Я подумал, что если я сделаю сериализуемый клиент-обработчик и маршалбай-сервер-обработчик, он отправит обработчик клиента на сторону cilent и позволит ему удаленно общаться с обработчиком сервера.Я построил такой RealProxy, и он действительно создает экземпляры моих EnumeratorClientBatchHandler<> и EnumeratorServerBatchHandler<> каждый раз, когда видит IEnumerator.Однако я не могу "удаленно" RealProxy с удаленным взаимодействием .NET, потому что он не может быть подклассом MarshalByRefObject и RealProxy одновременно.

Единственный путь вперед, который я вижу, - это создание моей собственной системы удаленного взаимодействия, которая не требует, чтобы реализации интерфейса были подклассами MarshalByRefObject для их прокси-удаленного управления.Я не вижу причин, по которым это невозможно, поскольку похоже, что RealProxy может прокси-сервер любого типа интерфейса.(только .NET remoting проверяет, является ли базовый тип MarshalByRefObject).Как побочный эффект, я думаю, было бы неплохо иметь систему удаленного взаимодействия, которая использует новую асинхронную систему C # 5.0, чтобы позволить асинхронному обработчику обслуживать «стандартный» интерфейс.


Это Q / A ниже кажется частично связанным, и говорит об использовании пользовательского сериализатора (protobuf) с WCF.Тем не менее, это несколько отличается от того, что я ищу.(1) он по-прежнему сериализует все данные в двоичный поток, отсутствует «текущий прокси-канал», такой как мне нужен выше, чтобы продолжать выполнять пакетные вызовы через прокси-канал удаленного взаимодействия, (2) шаблон WCF для ручного преобразования результатов возвратаEndpointAddress10 кажется несовместимым с вышеуказанным шаблоном.

Как использовать пользовательскую сериализацию во время удаленного взаимодействия .NET?

Конечно, я знаю, что могу создать интерфейс удаленного взаимодействия, который IS интерфейс пакетной обработки,а затем заставьте клиентов вручную работать с пакетной обработкой ... или попросите их вручную обернуть пакетный интерфейс в их собственный экземпляр EnumerableBatchHandlerClient.Я пытаюсь понять, как сделать это прозрачным способом, потому что у меня будет много интерфейсов, проходящих через определенную систему, IEnumerables будут очень распространены, и я хотел бы, чтобы удаленное взаимодействие было «автоматическим» длявсе, что похоже на вызов типа basic-datatype или IEnumerable (с пакетной поддержкой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...