.NET 远程处理可以为具有可序列化成员的接口生成透明代理远程,例如:
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; } }
}
当 IEnumerable 出现在代理界面中时,有没有办法让 .NET Remoting 透明地生成和链接我的自定义客户端/服务器“ienumerable 批处理代理”?
更新:我这样做的一个狡猾的想法是建立一个RealProxy
可以插入存根的工作,并将其粘贴在我的远程班级前面。我想如果我使客户端处理程序可序列化和服务器处理程序 marshalbyref 它会将客户端处理程序发送到 cilent 端并让它与服务器处理程序远程对话。我构建了这样一个 RealProxy,它会忠实地实例化我的EnumeratorClientBatchHandler<>
,并且EnumeratorServerBatchHandler<>
任何时候它看到一个IEnumerator
. 但是,我不能RealProxy
使用 .NET 远程处理“远程”,因为它不能同时是MarshalByRefObject
and的子类RealProxy
。
我看到的唯一前进道路是构建我自己的远程处理系统,它不需要接口实现成为 MarshalByRefObject 的子类来代理远程它们。我看不出这是不可能的任何原因,因为看起来 RealProxy 可以代理任何接口类型。(只有 .NET 远程处理检查基础类型是 MarshalByRefObject)。作为附带的好处,我认为拥有一个使用新的 C# 5.0 异步系统来允许异步处理程序为“标准”接口提供服务的远程处理系统会很好。
下面的这个 Q/A 似乎是半相关的,并讨论了将自定义序列化程序 (protobuf) 与 WCF 一起使用。但是,这与我在某些方面寻找的不同。(1)它仍然将所有数据序列化为二进制流,没有像上面我需要的“正在进行的代理通道”来继续通过远程通道发出代理批处理调用,(2)翻译返回结果的手动 WCF 模式到 EndpointAddress10 似乎与上述模式不兼容。
当然我知道我可以制作一个远程接口,它是批处理接口,然后让客户端手动处理批处理......或者让他们手动将批处理接口包装在他们自己的 EnumerableBatchHandlerClient 实例中。我试图弄清楚如何以透明的方式做到这一点,因为我将有许多通过特定系统出售的接口,IEnumerables 将非常常见,我希望远程处理是“自动的”任何看起来像基本数据类型调用或 IEnumerable(具有批处理支持)的东西。