2012-06-01 42 views
3

例如,WCF服务可以充当其他WCF服务的工厂吗? 例如为:一个WCF服务可以返回一个吗?

[ServiceContract(Namespace = "Foo")] 
interface IThing 
{ 
    [OperationContract] 
    void DoSomething(); 
} 

[ServiceContract(Namespace = "Foo")] 
interface IMakeThings 
{ 
    [OperationContract] 
    IThing Create(string initializationData); 
} 

同样可以在接口采取另一种接口作为参数?

[ServiceContract(Namespace = "Foo")] 
interface IUseThings 
{ 
    [OperationContract] 
    void UseThing(IThing target); 
} 

这是否需要调整已知类型?

所有的接口将被预先定义并且被客户端和服务都知道。

+0

号码WCF是基于**消息的**系统 - 它将XML序列化**数据**(仅数据 - 无代码或方法)从客户端到服务器并返回。它不是*被设计成远程或支持“远程对象调用”或类似的东西。 –

+0

在客户端有代理,而不是真正的服务实例。所以这个问题根本就没有意义。 –

+1

我可能会遗漏一些东西,但理论上,客户端可能会根据对“IMakeThings”服务的绑定将IMakeThings.Create()的返回结果包装在适当的“IThing”代理中。这个问题的答案很可能是“不”,这很好,但我认为这个问题本身是有道理的。 – WaffleSouffle

回答

8
  1. 不会。当你浏览网页时,你不会处理像C#那样的引用,所以你将无法返回一个不可序列化的对象。即使这样,只有标记为DataMember数据才会遇到。

  2. 是的。你将不得不调整已知类型的,但同样,这将是一个接口,一个DataContract不是OperationContract的

+0

我并不想要序列化接口或引用,而是设置更多的代理和绑定,类似于将用于建立原始客户端到服务连接的ChannelFactory.CreateChannel()路由。 – WaffleSouffle

+0

我明白了,但这就是WCF的工作原理。如果你想要返回某种服务,它必须是一个自定义对象,其中包含关于服务的信息(说明如何调用它),而不是服务本身。在内部,在非WCF代码中,这是可行的,因为您需要来回传递引用。通过WCF它不会因为你传递数据的静态实例。它可能通过命名管道,因为它传递了内存指针,但我怀疑它会起作用。 –

+0

现在,让我补充一点,如果你愿意,你可以设置一种方式让你将指令发回给客户,他们有什么其他方法选项,最有可能是服务URL的字符串描述,以及也许方法签名,取决于你想如何皮肤的猫。你的最终目标是可能的,而不是你在你的问题中如何去尝试。 –

0

我不认为这是可能的。当您在接收或返回对象的WCF服务上调用方法时,实际发生的情况是该对象正在被序列化,并且序列化的表单正在被传递。

这就是为什么在客户端,您没有得到DataContract -attributed类的“全面实现”,而是仅包含标记为序列化的属性的存根。你甚至不知道这些方法。 WCF服务归于ServiceContract,而不是DataContract,因此这根本不起作用。

使用将接口传递给服务方法的能力需要服务知道哪个实现将被反序列化。虽然我没有真正尝试过,但我认为这不会起作用,但您可能会在这里惊讶我:-)

+0

我相信你是正确的,但是对于反例,服务的回调协议会回调到客户端,这确实需要明确的管道代码,但是通过接口将服务传递给其他服务的示例。在数据序列化之后,我并没有像在现有的绑定中设置更多的代理那样。 – WaffleSouffle

+0

我不认为回调合同是这样工作的。我猜他们没有传递回调服务的实例,但客户端也透明地设置了WCF服务。 –

+0

您可以轻松地为现有绑定设置更多服务。您可以简单地在配置中声明第二个服务,使其使用相同的绑定,但追加到URI。例如,你的第一个服务的URI是'net.tcp:// localhost:8080/MyService/Service1',你可以简单地在URI上有一个secon服务'net.tcp:// localhost:8080/MyService/Service2'端口,相同的基本URI!)。 –

相关问题