处理大型对象的WCF服务
将WCF作为在远程PC之间执行RPC的一种方式来使用,您可以很好地将对象作为方法参数发送。这很容易编码,但意味着每当对象发生变化时,您都会发送整个内容,而且还可能意味着接收器必须有额外的逻辑才能仅对变化的字段进行操作。或者您可以拥有一个类,该类在对象的每个属性上都有一个方法。如果您有一个较大的类,并且通常只更改一个属性,那么这种细粒度方法对于性能来说是非常好的。但是要编写的代码要多得多,每次对象获得另一个属性时都必须维护它 有没有更好的方法可以避免为每个属性编写大量的复制粘贴方法,而且只发送实际更改的属性?我们可以从类/接口或其他东西自动生成WCF服务方法吗 例如,假设我们有(伪)类,目标是两个应用程序希望保持关于人的同步(我添加了一个复杂的属性列表,使其更像现实生活):处理大型对象的WCF服务,wcf,Wcf,将WCF作为在远程PC之间执行RPC的一种方式来使用,您可以很好地将对象作为方法参数发送。这很容易编码,但意味着每当对象发生变化时,您都会发送整个内容,而且还可能意味着接收器必须有额外的逻辑才能仅对变化的字段进行操作。或者您可以拥有一个类,该类在对象的每个属性上都有一个方法。如果您有一个较大的类,并且通常只更改一个属性,那么这种细粒度方法对于性能来说是非常好的。但是要编写的代码要多得多,每次对象获得另一个属性时都必须维护它 有没有更好的方法可以避免为每个属性编写大量的复制粘贴方法,而且只发送实际
class宠物
{
字符串名;
动物型;
}
班主任
{
智力年龄;
浮动高度;
字符串名;
列出宠物
}
WCF本身并不能做到这一点。有许多方法可以找出变化,但在大多数情况下,这是开发人员的职责
唯一可以找到的预定义解决方案是ADO.NET数据服务。这实际上是微软实体框架Datacontext的RESTful WCF服务包装器。老实说,您实际上不仅可以使用EF。在客户端,您可以获得跟踪更改的上下文。当您提交更改时,客户端只发送具体的更改。但这将限制您使用HTTP传输和XML或JSON序列化,这确实会影响大型对象的性能
当您向服务器发送带有元数据的命令时,也可能有某种事件驱动的解决方案 不管你怎么做,都会有开销。由您决定哪种开销最适合您。可能的办法:
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 MedicalData;
列出宠物名单;
}
类个人数据{
智力年龄;
字符串SSN;
}
医学数据类{
浮重;
浮动高度;
}
等级宠物{
字符串名;
动物型;
}
接口IPerson{
无效更新(人员数据、bool includePersonalData、bool includeMedicalData、bool includePets);
}
在客户端代码中,如果您不想更新医疗数据,那么可以将false传递给update方法,而不必费心实例化数据中的
MedicalData
对象。这将减少网络流量,因为信息集中的相应元素将丢失。解决方案实际上取决于绑定约束是什么。如果您被迫使用basicHttp绑定,那么正如Pavel和Christian所说,ADO.Net数据服务可能是最好的方法。但是,如果NetTcp和其他更复杂的绑定(WS*)可用,您可以研究具有有序交付的可靠消息传递。你可以把你的回答分成小块,然后把它们放回另一端。还可以查看流传输与缓冲传输。当然,这需要比ADO.Net数据服务做更多的工作,但这让它更有趣,不是吗
此外,请记住合同优先开发。在web服务中使用参数化方法将约束您,并且您想要进行的任何更改都将强制执行新版本,即使是任何微小的更改(例如,返回的附加字段)
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);
}