.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 (с пакетной поддержкой).