2016-09-19 75 views
0

假設我有類似這樣的(與所有必要的WCF屬性)類:我可以從WCF服務中返回數據生產者嗎?

class JobProducer 
{ 
    Job Produce() 
    { 
     // Do some work 
     return new Job(params); 
    } 
} 

和WCF服務(我不寫所有的屬性,但他們在那裏)

class MyService : IService 
    { 
     Producer GetProducer() 
     { 
      return new Producer(); 
     }  
    } 

和WCF客戶端:

IService client; 
var producer = client.GetProducer(); 
var job = producer.Produce(); 
while (job != null) 
{ 
    // Process job 
    job = producer.Produce(); 
} 

請問那種設計工作?我應該知道有什麼缺點嗎?

更具體地說,當我調用Producer上的Produce()方法時會發生什麼?當WCF將Job準備好時,WCF會將該方法調用路由到服務並取消阻止客戶端線程?

我想過簡單地從服務中返回一個Stream,但我想避免將字節反序列化到一個具體的類,並讓框架爲我做。

+1

WCF處理純粹的序列化。您通過線路發送屬性,而不是實例。您正在尋找「遠程處理」,或從客戶端控制居住在某個服務器上的對象。 – CodeCaster

+0

@CodeCaster這是否意味着我無法調用WCF返回的某個方法? – Shmoopy

+0

你不能,因爲生成的類沒有方法。如果您可以在服務和客戶端之間共享DTO定義,但代碼將在客戶端上運行。 – CodeCaster

回答

1

Job類的本地實例上的Produce()方法將被執行。由於Produce()不是服務端點,因此不會進行服務器調用。從服務端點返回的作業實例不是從服務器租用的,而是完全獨立的,重要的是,與服務器上的類型不同,但是是與序列化兼容的類型。

+0

謝謝。使用該邏輯,如何從服務中返回Stream?我見過一些例子,其中客戶端從服務中獲取Stream並對其執行Read()操作。 – Shmoopy

+0

這是因爲它有一個Stream。標準WCF類是實例,不能從服務器部分反序列化。流是爲部分反序列化設計的。如果您使用異步服務器模式,則甚至可以對IEnumerable 執行相同操作,並使其在服務器已準備好之前生成枚舉中的第一項 - 直到解析完整個Enumerable,客戶端和服務器之間的連接仍然存在。 – PhillipH