2013-02-28 137 views
0

WCF服務能否返回其他服務?返回其他服務的WCF服務

代碼:

[ServiceContract] 
public interface IServiceA 
{ 
    [OperationContract] 
    IServiceB GetServiceB(); 

[ServiceContract] 
public interface IServiceB 
{ 


public class ServiceA : IServiceA 
{ 
    public IServiceB GetServiceB() 
    { 
     return new ServiceB(); 
    } 

,這是激活ServiceA形式調用ServiceB:鑄造這樣當

public partial class Form1 : Form 
{ 
    private void button1_Click(object sender, EventArgs e) 
    { 
     ServiceReference1.ServiceAClient client = new 
      ServiceReference1.ServiceAClient(); 
     IServiceB serviceB = client.GetServiceB(); 

Ofcourse這不能因爲GetServiceB進行()返回對象,而不是服務:

IServiceB serviceB = (ServiceB) client.GetServiceB(); 

我得到CommunicationException:「現有連接w由遠程主機強行關閉「

+0

YPU爲什麼要這麼做呢?只需從客戶端調用ServiceB! – Jocke 2013-02-28 15:28:07

+0

我只想要1個端點。ServiceA將向我展示許多對象,我不想要許多端點 – ilansch 2013-02-28 15:28:54

+0

您正在尋找的是發現服務體系結構 – Dhawalk 2013-02-28 15:44:12

回答

1

是的,你不能。

傳遞遠程引用的這種簡單性也是.NET Remoting中最大的危險之一。在許多體系結構中,除了一些非常有限的和受控的情況外,並不希望傳輸遠程引用。傳遞一個MarshalByRefObject而不是 [Serializable]對象 - 通常會導致性能和可伸縮性的惡化。畢竟:每個方法調用 現在必須通過網絡,可能跨越多個城市,國家或大陸的多個 。

...

在WCF可以傳遞到遠程服務的引用,但是你必須要 約這樣做很明確的。通常不能沒有 非常明確的意圖。

通過Ingo

所以有共享服務實例的能力(shareable services)acrоss客戶。可共享的是WCF的Beta1或Beta2版本,但在產品最終版本發佈之前已經被切斷。不過,文章說:

可以重新使用.NET遠程基礎IRemoteFactory接口和 註釋它是兼容WCF

保留引用(克倫特對象圖)part很有趣了。

今天,你可以用InstanceContextMode.Single(和自定義客戶服務與客戶的對話邏輯)客戶端(「共享實例」)之間的相互作用或IInstanceContextProvider

2

不,您不能這樣做 - 您的客戶端需要ServiceB端點的配置數據。

解決此問題的另一種方法是讓ServiceA調用ServiceB,這樣您的客戶端只需與ServiceA進行交互即可。

+0

我該怎麼做? – ilansch 2013-03-01 06:48:57

+0

只需使用ServiceA作爲ServiceB的客戶端即可 – SalientBrain 2013-03-01 12:04:24