.Net Framework
3.0
WCF 自宿主例子
.Net Framework 3 .0是基于.Net 2.0 ,加上WPF,WCF,WWF封装而成的。
其中WCF是Windows Communication Foundation。
其实WCF做的贡献就是,把现有的所有分布式技术(如Web Services(ASMX), .Net Remoting, Enterprise Services, WS -* , MSMQ消息队列)统一起来,让开发分布式应用更一致,更简单。
以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于Internet;以宿主程序而论,可以以ASP.NET,EXE,WPF,Windows Forms,NT Service,COM + 作为宿主(Host)。WCF可以支持的协议包括TCP,HTTP,跨进程以及自定义,安全模式则包括SAML,Kerberos,X509,用户 / 密码,自定义等多种标准与模式。
下面仅介绍托管应用程序宿主(自宿主)的方式:(例子是一个实现用户登录注册服务)
建立三个工程:
Client 使用WCF服务
Common 定义合同规范
Server 实现WCF服务
Common:
在WCF中,所有的服务都暴露合同。合同是一种描述服务所实现功能的平台中立的标准的方式。WCF定义了四种类型的合同:
· 服务合同描述你可以在服务上执行哪些操作。
· 数据合同定义哪些数据类型被传入和传出服务。WCF为内置类型定义隐式合同,例如int和string,但是你可以容易地为定制类型定义显式的选入式数据合同。
· 错误合同定义哪些错误将被该服务所激发,以及该服务怎样处理错误信息和把如何把它们传播到客户端。
· 消息合同允许服务直接与消息进行交互。消息合同可以被类型化或非类型化,并且有点类似于CLR中的迟绑定调用。不过,消息合同很少为SOA开发者所用。
1 .服务合同:
using System.Collections.Generic;
using System.Text;
/**/ /**/ /**/ /**
* ServiceContract,OperationContract 在System.ServiceModel.dll中
* */
using System.ServiceModel;
using Common.Entity;
namespace Common.Interface
{
[ServiceContract]
public interface IUserService
{
[OperationContract]
OperationResult Login(string userName, string password);
[OperationContract]
OperationResult Register(string userName, string password);
[OperationContract]
OperationResult ModifyPassword(string userName, string newPassword);
}
}
2 .数据合同:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
namespace Common.Entity
{
[DataContract]
public class OperationResult
{
private ResultChoice result;
private string failReason;
[DataMember]
public ResultChoice Result
{
get
{
return result;
}
set
{
result = value;
}
}
[DataMember]
public string FailReason
{
get
{
return failReason;
}
set
{
failReason = value;
}
}
}
public enum ResultChoice
{
Succeed=1,
Failed=0
}
}
3 .错误合同:
// 略
Server实现:
using System;
using System.Collections.Generic;
using System.Text;
using Common.Interface;
using Common.Entity;
namespace Server.DAL
{
public class UserService:IUserService
{
IUserService MembersIUserService Members#region IUserService Members
public OperationResult Login(string userName, string password)
{
OperationResult result = new OperationResult();
if (userName.Equals("A") && password.Equals("B"))
{
result.Result = ResultChoice.Failed;
result.FailReason = "The password of A is not B!!!";
}
return result;
}
public OperationResult Register(string userName, string password)
{
throw new Exception("The method or operation is not implemented.");
}
public OperationResult ModifyPassword(string userName, string newPassword)
{
throw new Exception("The method or operation is not implemented.");
}
#endregion
}
}
运行服务:
using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using Server.DAL;
namespace Server
{
class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(UserService));
host.Open();
Console.WriteLine("The service is ready.");
Console.ReadLine();
host.Close();
}
}
}
服务端App.Config:
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< configuration >
< system.serviceModel >
< services >
< service name = " Server.DAL.UserService " >
< endpoint address = " net.tcp://localhost:8001/UserService "
binding = " netTcpBinding "
contract = " Common.Interface.IUserService " >
<!-- 指定服务的契约接口 -->
</ endpoint >
</ service >
</ services >
</ system.serviceModel >
</ configuration >
Client客户端:
客户端App.Config:
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< configuration >
< system.serviceModel >
< client >
< endpoint name = " UserServiceClient " address = " net.tcp://localhost:8001/UserService "
binding = " netTcpBinding "
contract = " Common.Interface.IUserService " >
</ endpoint >
</ client >
</ system.serviceModel >
</ configuration >
使用服务:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Client.Util;
using Common.Entity;
using Common.Interface;
using System.ServiceModel;
namespace Client
{
static class Program
{
/**//**//**//// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
OperationResult result = null;
using (ChannelFactory<IUserService> factory = new ChannelFactory<IUserService>("UserServiceClient"))
{
IUserService service = factory.CreateChannel();
result = service.Login("A", "B");
Console.WriteLine(result.FailReason);
}
}
}
}
运行结果为:
The password of A is not B !!!
.Net Framework 3 .0是基于.Net 2.0 ,加上WPF,WCF,WWF封装而成的。
其中WCF是Windows Communication Foundation。
其实WCF做的贡献就是,把现有的所有分布式技术(如Web Services(ASMX), .Net Remoting, Enterprise Services, WS -* , MSMQ消息队列)统一起来,让开发分布式应用更一致,更简单。
以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于Internet;以宿主程序而论,可以以ASP.NET,EXE,WPF,Windows Forms,NT Service,COM + 作为宿主(Host)。WCF可以支持的协议包括TCP,HTTP,跨进程以及自定义,安全模式则包括SAML,Kerberos,X509,用户 / 密码,自定义等多种标准与模式。
下面仅介绍托管应用程序宿主(自宿主)的方式:(例子是一个实现用户登录注册服务)
建立三个工程:
Client 使用WCF服务
Common 定义合同规范
Server 实现WCF服务
Common:
在WCF中,所有的服务都暴露合同。合同是一种描述服务所实现功能的平台中立的标准的方式。WCF定义了四种类型的合同:
· 服务合同描述你可以在服务上执行哪些操作。
· 数据合同定义哪些数据类型被传入和传出服务。WCF为内置类型定义隐式合同,例如int和string,但是你可以容易地为定制类型定义显式的选入式数据合同。
· 错误合同定义哪些错误将被该服务所激发,以及该服务怎样处理错误信息和把如何把它们传播到客户端。
· 消息合同允许服务直接与消息进行交互。消息合同可以被类型化或非类型化,并且有点类似于CLR中的迟绑定调用。不过,消息合同很少为SOA开发者所用。
1 .服务合同:
using System.Collections.Generic;
using System.Text;
/**/ /**/ /**/ /**
* ServiceContract,OperationContract 在System.ServiceModel.dll中
* */
using System.ServiceModel;
using Common.Entity;
namespace Common.Interface
{
[ServiceContract]
public interface IUserService
{
[OperationContract]
OperationResult Login(string userName, string password);
[OperationContract]
OperationResult Register(string userName, string password);
[OperationContract]
OperationResult ModifyPassword(string userName, string newPassword);
}
}
2 .数据合同:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
namespace Common.Entity
{
[DataContract]
public class OperationResult
{
private ResultChoice result;
private string failReason;
[DataMember]
public ResultChoice Result
{
get
{
return result;
}
set
{
result = value;
}
}
[DataMember]
public string FailReason
{
get
{
return failReason;
}
set
{
failReason = value;
}
}
}
public enum ResultChoice
{
Succeed=1,
Failed=0
}
}
3 .错误合同:
// 略
Server实现:
using System;
using System.Collections.Generic;
using System.Text;
using Common.Interface;
using Common.Entity;
namespace Server.DAL
{
public class UserService:IUserService
{
IUserService MembersIUserService Members#region IUserService Members
public OperationResult Login(string userName, string password)
{
OperationResult result = new OperationResult();
if (userName.Equals("A") && password.Equals("B"))
{
result.Result = ResultChoice.Failed;
result.FailReason = "The password of A is not B!!!";
}
return result;
}
public OperationResult Register(string userName, string password)
{
throw new Exception("The method or operation is not implemented.");
}
public OperationResult ModifyPassword(string userName, string newPassword)
{
throw new Exception("The method or operation is not implemented.");
}
#endregion
}
}
运行服务:
using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using Server.DAL;
namespace Server
{
class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(UserService));
host.Open();
Console.WriteLine("The service is ready.");
Console.ReadLine();
host.Close();
}
}
}
服务端App.Config:
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< configuration >
< system.serviceModel >
< services >
< service name = " Server.DAL.UserService " >
< endpoint address = " net.tcp://localhost:8001/UserService "
binding = " netTcpBinding "
contract = " Common.Interface.IUserService " >
<!-- 指定服务的契约接口 -->
</ endpoint >
</ service >
</ services >
</ system.serviceModel >
</ configuration >
Client客户端:
客户端App.Config:
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< configuration >
< system.serviceModel >
< client >
< endpoint name = " UserServiceClient " address = " net.tcp://localhost:8001/UserService "
binding = " netTcpBinding "
contract = " Common.Interface.IUserService " >
</ endpoint >
</ client >
</ system.serviceModel >
</ configuration >
使用服务:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Client.Util;
using Common.Entity;
using Common.Interface;
using System.ServiceModel;
namespace Client
{
static class Program
{
/**//**//**//// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
OperationResult result = null;
using (ChannelFactory<IUserService> factory = new ChannelFactory<IUserService>("UserServiceClient"))
{
IUserService service = factory.CreateChannel();
result = service.Login("A", "B");
Console.WriteLine(result.FailReason);
}
}
}
}
运行结果为:
The password of A is not B !!!