【问题标题】:How do I get WCF to generate a list of proxies?如何让 WCF 生成代理列表?
【发布时间】:2012-03-10 05:24:23
【问题描述】:

如何让 WCF 生成实际对象的代理列表或 IEnumerable?我在自托管应用程序中执行此操作。

这是我所拥有的:

public interface IRemoteControlGroup {
     List<IRemoteControl> GetInstances();
}

public class RemoteControlGroupImpl : IRemoteControlGroup {
    public List<IRemoteControl> GetInstances()
    {
        System.Console.Error.WriteLine("Called GetInstances()");
        List<IRemoteControl> list = new List<IRemoteControl>();
        // implementation detail: get this list of IRemoteControl objects
        return list;
    }
}

public interface IRemoteControl {
     void Stop();
     void Start();
     void GetPID();
}

public class RemoteControlImpl : IRemoteControl {
     // actual implementation
}

我希望 WCF:

  • 提供服务RemoteControlGroupImpl,由IRemoteControlGroup 上的合同定义。
  • 在调用IRemoteControlGroup.GetInstances() 时(在客户端)给我一个List&lt;IRemoteControl&gt;,其中列表的元素是实现IRemoteControl 的代理(通过调用主机的实际IRemoteControl 对象)。

我不希望 WCF 通过网络推送实际的 RemoteControlImpl 对象;我只希望它推送实现IRemoteControl 的代理。 RemoteControlImpl 对象实际上包含本地系统的句柄(窗口句柄,因为我们的应用程序只公开一个 GUI 界面),因此不可序列化。 GetInstance() 返回的元素数量可以变化。

我找到了this article,这听起来像是我想要的。有点儿。但它并没有告诉我如何在代码中做到这一点;只是在配置中。它也不能完全描述我想要什么。服务的入口点提供代理;但我希望我的服务的入口点提供代理列表。

【问题讨论】:

  • 对 WSHttpBinding/NetTcpBinding 和会话的警告欢迎。我是所有这些 WCF 技术的新手。
  • 如果你是新手,那么你不应该离所见的例子太远。 WCF 不是 .NET 远程处理。
  • 谢谢。不幸的是,通常的管理需求是“面向未来”我们的技术,所以虽然我很乐意使用 .NET Remoting 或 CORBA,但除了 WCF 之外,我没有任何建议。
  • 不,我是说您正在尝试在 .NET Remoting 中做一些有意义的事情,但在 WCF 中却没有。您没有使用已被 WCF 取代的 Remoting,这是一件的事情。
  • 啊。那么,对于完成手头的任务,您有什么建议吗?

标签: c# wcf proxy wcf-proxy


【解决方案1】:

正如@John Saunders 所指出的,您需要重新考虑您的方法。根据驱动“多个”实例的原因,我可以想到几种可能有用的通用方法。

1) 如果它们是从应用程序外部驱动的(即可用的 IRemoteControl 目标列表在运行时不会动态更改),那么您可以通过多个端点公开相同的合约。例如。 http://localhost/remotecontrol.svc/instance1http://localhost/remotecontrol.svc/instance2 等。可以通过您的 WSDL 公开不同端点的可用性。

2) 如果多个目标是动态的,那么最简单的方法是重新定义您的合同:

public interface IRemoteControlGroup {
     List<string> GetInstances();
     void Stop(string instanceId);
     void Start(string instanceId);
     void GetPID(string instanceId);
}

在内部,您的服务将维护可用 IRemoteControl 对象的字典,以 InstanceId 为键,并将传入操作简单地路由到目标实例。

【讨论】:

  • 您好,感谢您的回复。我“需要重新考虑[我的]方法”的理由是什么? WCF 是否根本不支持范式,还是有设计原因?
  • @John Saunders 已经清楚地解释了这一点。我的印象是('啊。那么你有什么建议来完成手头的任务吗?')讨论已经转移到使用 WCF 的可行方法的建议上。
  • 我当时肯定没在看。你能启发我吗?我看到的最接近的解释是它“在 .NET Remoting 中有意义,但在 WCF 中没有意义”。这是否意味着这种使用模型是 WCF 中的一个合理遗漏(“你不能在 WCF 中这样做。”),或者这是否意味着它的功能存在,但不应该使用(“不要使用这个因为……”)?
  • WCF 已取代 .Net 远程处理。传递代理(一种 .Net 远程处理方法)不再被认为是好的形式,并且在 WCF 中不受支持。 (您所指的文档是基于预发布软件的)。 WCF 是对 .Net 远程处理的重大改进,提供更好的性能和互操作性,但您需要忘记传递代理的概念。
猜你喜欢
  • 2010-12-20
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
相关资源
最近更新 更多