最近学习WCF,主要是看artech的博客。下面是学习笔记:
(一)基本知识:
(1)WCF包含四种类型的契约:服务契约、数据契约、消息契约和错误契约.
(2)终结点(Endpoint):地址(Address)、绑定(Binding)和契约(Contract)三要素组成.Endpoint = ABC
(3)ABC介绍:
•地址(Address):地址决定了服务的位置,解决了服务寻址的问题
•绑定(Binding):绑定实现了通信的所有细节,包括网络传输、消息编码,以及其他为实现某种功能(比如安全、可靠传输、事务等)对消息进行的相应处理。WCF中具有一系列的系统定义绑定,比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等.
•契约(Contract):契约是对服务操作的抽象,也是对消息交换模式以及消息结构的定义。
下面是代码:
(二)WCFDemo介绍:中含有四个项目,项目如下
(1)Contracts:一个类库项目,定义服务契约(Service Contract)
ICalculator.cs代码如下


using System.Collections.Generic;
using System.Linq;
using System.Text;
// 添加命名空间
using System.ServiceModel;
// Contracts:一个类库项目,定义服务契约(Service Contract),引用System.ServiceMode程序集(WCF框架的绝大部分实现和API定义在该程序集中)
namespace Contracts
{
[ServiceContract(Name = " CalculatorService " ,Namespace = " www.baidu.com " )]
public interface ICalculator
{
[OperationContract]
double Add( double x, double y);
[OperationContract]
double Subtract( double x, double y);
[OperationContract]
double Multiply( double x, double y);
[OperationContract]
double Divide( double x, double y);
}
}
(2)Services:一个类库项目,提供对WCF服务的实现
CalculatorService.cs代码如下


using System.Collections.Generic;
using System.Linq;
using System.Text;
// 添加引用
using Contracts;
// 一个类库项目,提供对WCF服务的实现。定义在该项目中的所有WCF服务实现了定义在Contracts中相应的服务契约,所以Services具有对Contracts项目的引用
namespace Services
{
public class CalculatorService:ICalculator
{
public double Add( double x, double y)
{
return x + y;
}
public double Subtract( double x, double y)
{
return x - y;
}
public double Multiply( double x, double y)
{
return x * y;
}
public double Divide( double x, double y)
{
return x / y;
}
}
}
(3)Hosting:一个控制台(Console)应用,实现对定义在Services项目中的服务的寄宿
Program.cs代码如下


using System.Collections.Generic;
using System.Linq;
using System.Text;
// 添加命名空间
using Contracts;
using Services;
using System.ServiceModel;
using System.ServiceModel.Description;
// Hosting:一个控制台(Console)应用,实现对定义在Services项目中的服务的寄宿,该项目须要同时引用Contracts和Services两个项目和System.ServiceMode程序集
// WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程。WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段
// 在进行真正的WCF应用开发时,一般不会直接通过编码的方式进行终结点的添加和服务行为的定义,而是通过配置的方式进行
namespace Hosting
{
class Program
{
static void Main( string [] args)
{
using (ServiceHost host = new ServiceHost( typeof (CalculatorService)))
{
host.AddServiceEndpoint( typeof (ICalculator), new WSHttpBinding(), " http://127.0.0.1:9999/calculatorserivce " );
if (host.Description.Behaviors.Find < ServiceMetadataBehavior > () == null )
{
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
// 并采用了基于HTTP-GET的元数据获取方式
behavior.HttpGetEnabled = true ;
// 指定元数据的发布地址
behavior.HttpGetUrl = new Uri( " http://127.0.0.1:9999/calculatorservice/metadata " );
host.Description.Behaviors.Add(behavior);
}
host.Opened += delegate
{
Console.WriteLine( " CalculaorService已经启动,请按任意键停止服务 " );
};
// 在调用ServiceHost的Open方法对服务成功寄宿后,我们可以通过该地址获取服务相关的元数据。
// 在IE地址栏上键入http: // 127.0.0.1:9999/calculatorservice/metadata,你将会得到以WSDL形式体现的服务元数据
host.Open();
Console.ReadKey();
}
}
}
}
(4)Client:实现对WCF的调用。值得注意的是,要在上面Hosting项目产生的Hosting.exe运行的情况下,右键Client添加服务引用,并在地址栏输入:http://127.0.0.1:9999/calculatorservice/metadata
Program.cs代码如下


using System.Collections.Generic;
using System.Linq;
using System.Text;
using Client.ServiceReference1;
namespace Client
{
class Program
{
static void Main( string [] args)
{
using (CalculatorServiceClient proxy = new CalculatorServiceClient())
{
Console.WriteLine( " x+y={2} when x={0} and y={1} " , 1 , 2 ,proxy.Add( 1 , 2 ));
Console.WriteLine( " x-y={2} when x={0} and y={1} " , 1 , 2 , proxy.Subtract( 1 , 2 ));
Console.WriteLine( " x*y={2} when x={0} and y={1} " , 1 , 2 , proxy.Multiply( 1 , 2 ));
Console.WriteLine( " x/y={2} when x={0} and y={1} " , 1 , 2 , proxy.Divide( 1 , 2 ));
Console.ReadKey();
}
}
}
}