WCF分布式开发步步为赢(1):WCF分布式框架基础概念
根据微软官方的解释,WCF(之前的版本名为“Indigo”)是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。WCF是微软分布式应用程序开发的集大成者,它整合了.Net平台下所有的和分布式系统有关的技术,如Enterprise Sevices(COM+).Net Remoting、Web Service(ASMX)、WSE3.0和MSMQ消息队列。以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于 Internet;以宿主程序而论,可以以ASP.NET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host)。WCF可以支持的协议包括TCP,HTTP,跨进程以及自定义,安全模式则包括SAML, Kerberos,X509,用户/密码,自定义等多种标准与模式。也就是说,在WCF框架下,开发基于SOA的分布式系统变得容易了,微软将所有与此相关的技术要素都包含在内,掌握了WCF,就相当于掌握了叩开SOA大门的钥匙。(参考MSDN)
|
ASMX
|
.NET Remoting
|
企业服务
|
WSE
|
MSMQ
|
Indigo
|
|
|---|---|---|---|---|---|---|
|
Web 服务
|
X
|
X
|
||||
|
.NET - .NET 通信
|
X
|
X
|
||||
|
分布式事务等。
|
X
|
X
|
||||
|
WS-* 规范支持
|
X
|
X
|
||||
|
队列消息传输
|
X
|
X
|
2.宿主:一种应用程序域和进程,服务将在该环境中运行。ASP.NET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host) 。
3.终结点:服务暴露出来的地址,由客户端用于访问服务。通常提及的概念就是ABC,即地址、绑定和契约的第一个字母的简称。 如图:
//ServiceContract 属性以及 Indigo 使用的所有其他属性均在 System.ServiceModel 命名空间中定义,
//因此本例开头使用 using 语句来引用该命名空间。
namespace WCFService
{
//1.服务契约
[ServiceContract(Namespace =
"http://www.cnblogs.com/frank_xl/")]
public interface IWCFService
{
//操作契约
[OperationContract]
string SayHello(string name);
//操作契约
[OperationContract]
string SayHelloToUser(User user);
}
//2.服务类,集成接口。实现契约
public class WCFService : IWCFService
{
//实现接口定义的方法
public string SayHello(string name)
{
Console.WriteLine("Hello! {0},Using string ", name);
return "Hello! " + name;
}
//实现接口定义的方法
public string SayHelloToUser(User user)
{
Console.WriteLine("Hello! {0} {1},Using DataContract ", user.FirstName, user.LastName);
return "Hello! " + user.FirstName + " " + user.LastName;
}
}
//3.数据契约//序列化为XML,作为元数据封装到服务里
[DataContract]
public struct User
{
[DataMember]
public string FirstName;
[DataMember]
public string LastName;
}
}
//采用自托管方式,也可以是IIS、WAS,Windows服务等用户自定义程序托管服务
public
class WCFHost
{
static
void Main(
string[] args)
{
//反射方式创建服务实例,
//Using方式生命实例,可以在对象生命周期结束时候,释放非托管资源
using (ServiceHost host =
new ServiceHost(
typeof(WCFService.WCFService)))
{
//相同的服务注册多个基地址
//添加服务和URI,用户资源标识符
//Uri tcpAddress = new Uri("http://localhost:8001/WCFService");
Uri httpAddress =
new Uri(
"http://localhost:8002/WCFService");
//Uri httpAddressLisening = new Uri("http://localhost:8002/WCFService");
//host.AddServiceEndpoint(typeof(WCFService.IWCFService), new WSHttpBinding(), tcpAddress);
host.AddServiceEndpoint(typeof(WCFService.IWCFService), new WSHttpBinding(), httpAddress);
//判断是否以及打开连接,如果尚未打开,就打开侦听端口
//if (host.State !=CommunicationState.Opening)
host.Open();
//显示运行状态
Console.WriteLine("Host is runing! and state is {0}",host.State);
//等待输入即停止服务
Console.Read();
}
}
}
class WCFClient
{
static void Main(string[] args)
{
//IWCFService proxy = ChannelFactory<IWCFService>.CreateChannel(new WSHttpBinding(),
//////new EndpointAddress("net.tcp://localhost:8001/WCFService"));
////new EndpointAddress("http://localhost:8002/WCFService"));
WCFServiceClient wcfServiceProxy = new WCFServiceClient("WSHttpBinding_IWCFService1");
//通过代理调用SayHello服务
Console.WriteLine(wcfServiceProxy.SayHello("Frank Xu Lei"));
////通过代理调用调用SayHelloToUser,传递对象
User user = new User();
user.FirstName = "Lei";
user.LastName = "Frank";
Console.WriteLine(wcfServiceProxy.SayHelloToUser(user));
Console.Read();
}
}