2012-06-01 39 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!)。 –

相關問題