WCF学习笔记2
WCF的服务部能孤立地存在,需要寄宿于一个运行着的进程中,我们把承载WCF服务的进程成为宿主,为服务指定宿主的过程称为服务寄宿(Service Hosting)。
WCF服务的寄宿方式:自我寄宿(Self-Hosting)和IIS寄宿两种方式。
一、创建服务契约
- 服务契约定义一般采用接口的形式进行;
- 使用System.ServiceModel.ServiceContractAttribute特性应用在接口上,从而将其定义成服务契约;
- 接口函数上要显示的应用OperationContractAttribute特性,使其成为可访问的服务接口函数;
计算器小例子,如下:
1: [ServiceContract(Name="CalculatorService",Namespace="http://www.cnblogs.com/lisgang")]
2: public interface ICalculator
3: {
4: [OperationContract]
5: double Add(double x, double y);
6: [OperationContract]
7: double Subtract(double x, double y);
8: [OperationContract]
9: double Multiply(double x, double y);
10: [OperationContract]
11: double Divide(double x, double y);
12: }
二、创建服务
- 服务实现服务契约的接口
1: public class CalculatorService : ICalculator
2: {
3: public double Add(double x, double y)
4: {
5: return x + y;
6: }
7: public double Subtract(double x, double y)
8: {
9: return x - y;
10: }
11: public double Multiply(double x, double y)
12: {
13: return x * y;
14: }
15: public double Divide(double x, double y)
16: {
17: return x / y;
18: }
三、通过自我寄宿的方式寄宿服务
WCF服务需要一村一个运行着的宿主进程,服务寄宿就是为服务指定一个宿主的过程。WCF采用给予终结点(Endpoint)的通信手段。终结点是由地址(Address)、绑定(Binding)、和契约(Contract)三要素组成,简易记忆方法为:Endpoint=ABC.
地址(Address):地址决定了服务的位置,解决了服务寻址的问题;
绑定(Binding):绑定实现了通信的所有细节,包括网络传输、消息编码、以及它为实现某种功能(比如传输安全、可靠消息传输、事务等)对消息进行的相应处理。WCF中具有一系列的系统定义绑定,比如:BasicHttpBinding、WSHttpBinding和NetTcpBinding等。
契约(Contract):契约是对服务操作的抽象,也是对消息交换模式及消息结构的定义。
服务寄宿的目的就是开启一个进程,为WCF服务提供一个运行的环境,并为服务添加一个或多个终结点,使之暴露给潜在的服务消费者。
在Hosting中加入如下代码:
1: static void Main(string[] args)
2: {
3: using (ServiceHost host=new ServiceHost(typeof(CalculatorService)))
4: {
5: host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "http://127.0.0.1:3721/calculatorservice");
6: if (host.Description.Behaviors.Find<ServiceMetadataBehavior>()==null)
7: {
8: ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
9: behavior.HttpGetEnabled = true;
10: behavior.HttpGetUrl = new Uri("http://127.0.0.1:3721/calculatorservice/metadata");
11: host.Description.Behaviors.Add(behavior);
12: }
13: host.Opened += delegate
14: {
15: Console.WriteLine("CalculatorService已经启动,按任意键终止服务!");
16: };
17: host.Open();
18: Console.Read();
19: }
20: }
WCF服务寄宿通过System.ServiceModel.ServiceHost对象完成。在上面的代码中,基于服务类型(type(CalculatorService))创建了ServiceHost对象,并添加了一个基于WSHttpBinding绑定的终结点。该终结点的地址为:http://127.0.0.1:3721/calculatorservice,并指定了服务契约的类型ICalculator。
WCF服务的描述通过元数据(Metadata)的形式发布出来。WCF中元数据的发布通过一个特殊的服务行为ServiceMetadataBehavior来实现。
四、创建客户端调用服务
在客户端通过添加服务引用,将服务引用后,在客户端调用代码。具体如下:
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: using (CalculatorServiceClient proxy=new CalculatorServiceClient())
6: {
7: Console.WriteLine(string.Format("x+y={2} when x={0} and y={1}",1,2,proxy.Add(1,2)));
8: Console.WriteLine(string.Format("x-y={2} when x={0} and y={1}", 1, 2, proxy.Subtract(1, 2)));
9: Console.WriteLine(string.Format("x*y={2} when x={0} and y={1}", 1, 2, proxy.Multiply(1, 2)));
10: Console.WriteLine(string.Format("x/y={2} when x={0} and y={1}", 1, 2, proxy.Divide(1, 2)));
11: }
12: Console.Read();
13: }
14: }
Steve 标记: WCF学习笔记内容是学习大牛蒋金楠著作的WCF全面解析的内容,自己做个总结与标记。