如何让WCF生成代理列表

本文关键字:代理 列表 WCF | 更新日期: 2023-09-27 18:25:12

如何让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:

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

我不希望WCF通过连线推送实际的RemoteControlImpl对象;我只想让它推送实现IRemoteControl的代理。RemoteControlImpl对象实际上包含本地系统的句柄(窗口句柄,因为我们的应用程序只公开GUI接口),因此不可序列化。GetInstance()返回的元素数量可能会有所不同。

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

如何让WCF生成代理列表

正如@John Saunders所指出的,您需要重新思考您的方法。我可以想出几个可能有用的通用方法,这取决于驱动"多个"实例的因素。

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

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

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

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