[转载]第一个WCF服务应用

WCF全称Windows Communication Foundation,WCF的出现,是为了解决分布式计算提供可管理的方法,提供广泛的互操作性,并为服务定位提供直接的支持。
WCF 通过一种面向服务的新型编程模型简化了关联应用程序的开发。通过提供分层的体系结构,WCF 支持多种风格的分布式应用程序开发。WCF 通道体系结构在底层提供了异步的非类型化消息传递基元。而建立在此基础之上的是用于进行安全可靠的事务处理数据交换的各种协议功能,以及广泛的传输协议和编码选择。
下面创建一个WCF应用来了解WCF是如何工作的,这个例子就是用WCF实现最基本的加、减运算。
先创建整个解决方案:
Contracts:类库项目,定义服务契约(Service Contract)。
Service:类库项目,针对WCF服务的实现。
Host:控制台项目,WCF服务宿主,相当于提供WCF服务的服务器。
Client:控制台项目,模拟WCF客户端

一、创建WCF服务契约
契约这个概念相当于一种约定或者是一种特殊的声明,分为四种:服务契约、数据契约、消息契约和错误契约。后面会做详细介绍
Contracts类库项目,引用System.ServiceMode程序集,添加一个接口ICalculator,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// <summary>
/// 用于计算服务的服务契约
/// </summary>
[ServiceContract(Name="CalculatorService")]
public interface ICalculator
{
    /// <summary>
    /// 加法
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    [OperationContract]
    double Add(double x, double y);
  
    /// <summary>
    /// 减法
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    [OperationContract]
    double Subtract(double x, double y);
}

二、创建服务
服务即具体的WCF服务,新建一个CalculatorService类,来实现刚才建立的服务契约
Service类库项目,引用项目Contracts,新建CalculatorService类,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/// <summary>
/// 用于计算的服务
/// </summary>
public class CalculatorService : ICalculator
{
    #region ICalculator 成员
    /// <summary>
    /// 加法计算
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    public double Add(double x, double y)
    {
        return x + y;
    }
    /// <summary>
    /// 减法计算
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    public double Subtract(double x, double y)
    {
        return x - y;
    }
  
    #endregion
}

三、创建WCF服务器
WCF服务需要依存一个运行进程来运行WCF服务,这个服务可以是我们的asp.net应用程序,或者控制台应用程序等,这里我们用控制台应用程序来建立服务器。WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段。终结点由地址(Address)、绑定(Binding)和契约(Contract)三要素组成。
Host控制台项目,引用System.ServiceMode程序集、Contracts项目、Service项目,在Main入口内,添加如下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Program
{
    static void Main(string[] args)
    {
        //建立提供WCF服务的主机,服务内容是Service项目中的计算服务
        using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
        {
            //为主机增加契约(Contracs项目中的计算服务契约)、WSHttpBinding绑定、终结点地址
            host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "http://127.0.0.1:9999/calculatorservice");
            if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
            {
                //实例化服务行为
                ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
                //HttpGet方式获取元数据
                behavior.HttpGetEnabled = true;
                //设置元数据的发布地址,服务器开启后可以通过这个地址查看
                behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/calculatorservice/metadata");
                //将行为添加到服务器说明
                host.Description.Behaviors.Add(behavior);
            }
            //服务器开启后事件
            host.Opened += new EventHandler(host_Opened);
            //打开服务器
            host.Open();
            Console.Read();
        }
    }
  
    static void host_Opened(object sender, EventArgs e)
    {
        Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");
    }
}

四、创建客户端
在Client项目中添加服务引用,输入地址http://127.0.0.1:9999/calculatorservice/metadata,即我们上面所建立的元数据发布地址,修改命名空间名称CalculatorService,最后我们在Main入口输入下面代码

1
2
3
4
5
6
7
8
9
10
11
12
class Program
{
    static void Main(string[] args)
    {
        using (CalculatorServiceClient client = new CalculatorServiceClient())
        {
            Console.WriteLine(string.Format("{0}+{1}={2}", 1, 1, client.Add(1, 1)));
            Console.WriteLine(string.Format("{0}-{1}={2}", 1, 1, client.Subtract(1, 1)));
        }
        Console.Read();
    }
}

运行结果

到此,我们已经完成了第一个WCF服务从服务端到客户端的建立。

posted on 2012-01-21 20:02  Arrow.Lu  阅读(118)  评论(0)    收藏  举报