如何使用固定大小的批量通过网络代理远程.NET IEnumerable?

Dav*_*ske 5 c# wcf dynamic-proxy .net-remoting

.NET远程处理可以为具有可序列化成员的接口生成透明代理远程控制器,例如:

public interface INetworkInterface {
  bool login(string username, string password);
  bool ExecuteSomething(string command);
}
Run Code Online (Sandbox Code Playgroud)

我想为任何IEnumerator<T>返回结果提供自定义序列化器和活动代理 - 远程处理程序.我的自定义代理远程处理器将通过网络一次处理批量特定数量的元素.例如,给定以下接口:

public interface INetworkInterface2 {
    IEnumerable<string> ExecuteSomething(string command);
}
Run Code Online (Sandbox Code Playgroud)

我想提供一个自定义的序列化程序和代理,它可以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; } }

}
Run Code Online (Sandbox Code Playgroud)

当IEnumerable出现在代理接口中时,有没有办法让.NET Remoting透明地生成和链接我的自定义客户端/服务器"ienumerable batch proxy"?

更新:我这样做的一个狡猾的想法是构建一个RealProxy可以插入存根的工作,并将其粘贴在我的远程类之前.我想如果我使客户端处理程序可序列化并且服务器处理程序marshalbyref它会将客户端处理程序发送到cilent-side并让它远程与服务器处理程序通信.我建立这样一个RealProxy,而且它忠实地实例化了我EnumeratorClientBatchHandler<>EnumeratorServerBatchHandler<>任何时候它看到的IEnumerator.但是,我不能"远程"的RealProxy使用.NET远程处理,因为它不能成为一个子类MarshalByRefObject,并RealProxy在同一时间.

我看到的唯一前进路径是构建我自己的远程处理系统,该系统不需要接口实现为MarshalByRefObject的子类,以便代理远程它们.我认为没有任何理由这是不可能的,因为看起来RealProxy可以代理任何接口类型.(只有.NET远程处理检查底层类型是MarshalByRefObject).作为一个附带好处,我认为拥有一个使用新的C#5.0异步系统的远程处理系统可以让异步处理程序为"标准"接口提供服务.


下面的Q/A似乎是半相关的,并讨论了如何在WCF中使用自定义序列化器(protobuf).但是,这与我正在寻找的方式有所不同.(1)它仍然将所有数据序列化为二进制流,没有"正在进行的代理通道",例如我上面需要继续通过远程通道发出代理批量调用,(2)翻译返回结果的手动WCF模式到EndpointAddress10似乎与上面的模式不兼容.

如何在.NET远程处理期间使用自定义序列化?

当然我知道我可以创建一个远程接口,它批处理接口,然后让客户端手动处理批处理...或让他们手动将批处理接口包装在他们自己的EnumerableBatchHandlerClient实例中.我试图弄清楚如何以透明的方式做到这一点,因为我将通过一个特定的系统提供许多接口,IEnumerables将非常普遍,我希望远程处理能够"自动化"任何看起来像基本数据类型调用或IEnumerable(有批处理支持)的东西.