WCF(Windows Communication Foundation)是一个面向服务编程的综合分层架构。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。
Hprose(High Performance Remote Object Service Engine)是一款高性能跨语言跨平台的远程对象服务引擎,它支持众多语言和平台,包括主流的.NET、Java、PHP、Python、Ruby、JavaScript、ActionScript、Delphi、FreePascal、Objective-C、ASP、Perl、C++等。通过Hprose可以在这些支持的语言之间实现方便且高效的互通,能够有效的取代WebService实现跨语言跨平台的分布式电信级的解决方案。
WCF与Hprose都支持在Windows Azure Platform上运行。下面我们就来对它们在微软云计算平台上运行的各个方面做一个细致的比较。
语言支持
微软的Azure云平台上提供了直接发布WCF服务的Role,另外也可以通过创建ASP.NET Web Role方式自己添加WCF服务进行发布。但WCF服务只能使用.NET支持的语言(C#或VB.NET)来编写。
Hprose在微软的Azure云平台上则支持使用更多语言来发布服务。除了可以通过ASP.NET Web Role方式发布C#、VB.NET编写的Hprose服务,还可以通过CGI Web Role方式发布使用PHP编写的Hprose服务,甚至可以通过Worker Role方式来发布Java编写的服务。由此可见Hprose可以更充分的发挥微软的Azure云平台对多语言支持的功能。在通讯性能上的对比,如图1所示。
性能
图1 性能对比
上面的图表是对三个不同服务各调用1000次的时间对比,花费的时间越少,性能越高。由此可见,Hprose在Azure云计算平台上,以WebRole方式发布的服务,对比WCF来说没有明显的优势,甚至比WCF在Azure上以BasicHttpBinding方式发布的服务还要慢。但是Hprose在Azure上以 WorkerRole方式发布的服务,效率则高出WCF数倍。另外,WCF的BasicHttpBinding方式比WsHttpBinding方式效率高出一倍,这也是为何微软推荐大家采用BasicHttpBinding方式发布WCF服务的一个原因之一。
数据类型支持
在类型支持上WCF和Hprose各有千秋。对于基本类型、简单类型、简单对象,WCF和Hprose都提供支持。
但是对于DataSet这样的.NET特有类型,则WCF支持,Hprose不支持,因为DataSet在非.NET语言环境下无法使用。
而对于复杂的带有直接或间接自引用的对象数据,Hprose支持,而WCF不支持。例如下列类型:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> public enum Sex {
Unknown, Male, Female, InterSex
}
[Serializable]
public class User {
string name;
int age;
DateTime birthday;
Sex sex;
bool married;
List friends;
public string Name {
get {
return name;
}
set {
name = value;
}
}
public int Age {
get {
return age;
}
set {
age = value;
}
}
public DateTime Birthday {
get {
return birthday;
}
set {
birthday = value;
}
}
public bool Married {
get {
return married;
}
set {
married = value;
}
}
public Sex Sex {
get {
return sex;
}
set {
sex = value;
}
}
public List Friends {
get {
return friends;
}
set {
friends = value;
}
}
}
当服务方法为:
public List GetUsers() {
User user = new User();
user.Name = " 张三 " ;
user.Age = 30 ;
user.Birthday = new DateTime( 1980 , 12 , 1 );
user.Sex = Sex.Male;
user.Married = true ;
User user2 = new User();
user2.Name = " 李四 " ;
user2.Age = 28 ;
user2.Birthday = new DateTime( 1982 , 2 , 18 );
user2.Sex = Sex.Male;
user2.Married = false ;
User user3 = new User();
user3.Name = " 王五 " ;
user3.Age = 38 ;
user3.Birthday = new DateTime( 1972 , 6 , 14 );
user3.Sex = Sex.Male;
user3.Married = true ;
User user4 = new User();
user4.Name = " 赵六 " ;
user4.Age = 1 ;
user4.Birthday = new DateTime( 2008 , 11 , 23 );
user4.Sex = Sex.Male;
user4.Married = false ;
// 以下注释掉的代码 WCF 不支持,但 Hprose 支持
/*
user.Friends = new List();
user.Friends.Add(user2);
user.Friends.Add(user4);
user2.Friends = new List();
user2.Friends.Add(user);
user2.Friends.Add(user3);
user3.Friends = new List();
user3.Friends.Add(user2);
user4.Friends = new List();
user4.Friends.Add(user);
*/
List users = new List();
users.Add(user);
users.Add(user2);
users.Add(user3);
users.Add(user4);
return users;
}
转载于:http://blog.itpub.net/7679511/viewspace-666378/