2010-07-07 67 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服务中使用参数化方法会限制您的行进方向,即使对于任何小的更改(例如,返回一个附加字段),您想要进行的任何更改都会强制执行新版本。