2010-07-07 68 views
2

查看WCF的使用方式,以便在遠程PC之間執行RPC,您只需將對象作爲方法參數發送即可。這很容易編碼,但意味着每當對象發生變化時發送整個事物,也可能意味着接收器必須具有額外的邏輯才能對更改的字段進行操作。或者你可以有一個類,每個屬性在對象上有一個方法。如果您有一個較大的類並且通常只更改一個屬性,則這種細粒度的方法對於性能很好。但是要編寫更多的代碼,並且每次該對象獲得另一個屬性時都必須保留它。處理大型對象的WCF服務

有沒有更好的方法可以避免爲每個屬性編寫一個複製粘貼方法的負載,但也只發送實際更改的屬性?我們可以從類/接口或其他東西中自動生成WCF服務方法嗎?

比如講我們有(僞)班,目的是兩個應用程序要保持在約人同步(我加一個複雜的屬性列表,以使它有點更像現實生活中):

class Pet 
{ 
String name; 
AnimalType type; 
} 

class Person 
{ 
int age; 
float height; 
string name; 
List<Pet> pets 
} 

回答

1

WCF本身並不這樣做。有很多方法可以找出變化,但在大多數情況下,開發人員有責任。

唯一預定義的解決方案是ADO.NET DataServices。這實際上是Microsoft的Entity Framework Datacontext的RESTful WCF服務包裝器。說實話,你不僅可以用EF來使用它。在客戶端,你會得到一個跟蹤變化的上下文。當您提交更改時,客戶端僅發送具體更改。但是這限制了HTTP傳輸和XML或JSON序列化,這確實會影響大對象的性能。

當您使用某些元數據向服務器發送命令時,也可能有某種事件驅動解決方案。

1

但是,你這樣做會有開銷。由您決定什麼樣的開銷是您最能接受的。可能的方法:

  1. 忽略問題並始終發送完整實體。這裏的開銷是發送數據的絕對數量。
  2. 使用ADO.NET數據服務。這裏的開銷是數據上下文,更改跟蹤以及它的一般「討厭」。
  3. 重新設計您的合同以減少傳遞的數據量。這裏的開銷是服務接口的額外複雜性。選項3

例子:

class Person { 
    string Name; 
    PersonalData PersonalData; 
    MedicalData MedicalData; 
    List<Pet> Pets; 
} 

class PersonalData { 
    int Age; 
    string SSN; 
} 

class MedicalData { 
    float Weight; 
    float Height; 
} 

class Pet { 
    string Name; 
    AnimalType Type; 
} 

interface IPerson { 
    void Update(Person data, bool includePersonalData, bool includeMedicalData, bool includePets); 
} 

在客戶端的代碼,如果你不希望更新的醫療數據,那麼你可以通過虛假的更新方法,而不必費心實例化數據中的對象MedicalData。這會減少網絡流量,因爲InfoSet中的相應元素將會丟失。

1

解決方案真的取決於您的綁定約束是什麼。如果你被迫使用basicHttp綁定,那麼ADO.Net DataServices可能是Pavel和Christian所說的最好的方法。但是,如果NetTcp和其他更復雜的綁定(WS *)可用,則可以查看有序傳送的可靠消息傳遞。你可以把你的反應分解成更小的塊,並把它們放回另一端。同時看看流式傳輸與緩存傳輸。當然,這需要比ADO.Net DataServices多得多的工作,但這使得它更有趣,非?

另外,請記住合同第一次開發。在Web服務中使用參數化方法會限制您的行進方向,即使對於任何小的更改(例如,返回一個附加字段),您想要進行的任何更改都會強制執行新版本。