代码改变世界

WCF学习笔记(二)—— 建立一个简单的WCF应用程序

2009-06-15 12:54  羊鸵  阅读(895)  评论(1编辑  收藏  举报
使用Visual Studio 2008 创建WCF 应用程序

 

最简单的方法:打开VS2008 -> New Project -> WCF Service Application

  默认的项目中包含有IService1.cs, Service1.svc , Service1.svc.cs, web.config 等文件。

这次不采用这个方式,我按照[原创]我的WCF之旅(1):创建一个简单的WCF程序 这篇文章的方法,建立了自己的第一个WCF应用程序.

首先建立项目:Artech.WCFService

然后在这个项目下建立了三个工程:

  • Artech.WCFService.Contract (Class Library Project)——引用System.ServiceModel DLL
  • Artech.WCFService.Service(Class Library Project)——引用Artech.WCFService.Contract Project 和 System.ServiceModel DLL
  • WCFService(Web Site Project)——引用Artech.WCFService.Contract、Artech.WCFService.Service和System.ServiceModel DLL
1. Artech.WCFService.Contract :用来保存Contract(Service Contact、Message Contract、Data Contract)

 

任何一个分布式应用程序,它之所以能够互相传递消息,都是事先制定好数据交换规则的,这个规则正是交换数据的双方(比如服务器端和客户端)能彼此理解对方的依据,WCF作为分布式开发技术的一种,同样具有这样一种特性。而在WCF中制定的的规则就被称之为契约(Contract),它是WCF的消息标准,是任何一个wcf程序不可或缺的一部分。

在WCF中,契约分为四种,它们分别为:

  1. 用于定义服务操作的服务契约:Service Contract

    这种级别的契约又包括两种:ServiceContract和OperationContract

    ServiceContract用于类或者结构上,用于指示WCF此类或者结构能够被远程调用,而OperationContract用于类中的方法(Method)上,用于指示WCF该方法可被远程调用。

  2. 用于自定义数据结构的数据契约:Data Contract

    数据契约也分为两种:DataContract和DataMember.DataContract用于类或者结构上,指示 WCF此类或者结构能够被序列化并传输,而DataMember只能用在类或者结构的属性(Property)或者字段(Field)上,指示WCF该属性或者字段能够被序列化传输。

  3. 用于自定错误异常的异常契约:Fault Contract

    FaultContract用于自定义错误异常的处理方式,默认情况下,当服务端抛出异常的时候,客户端能接收到异常信息的描述,但这些描述往往格式统一,有时比较难以从中获取有用的信息,此时,我们可以自定义异常消息的格式,将我们关心的消息放到错误消息中传递给客户端,此时需要在方法上添加自定义一个错误消息的类,然后在要处理异常的函数上加上FaultContract,并将异常信息指示返回为自定义格式。

  4. 用于控制消息格式的消息契约:Message Contract

    简单的说,它能自定义消息格式,包括消息头,消息体,还能指示是否对消息内容进行加密和签名。

 2. Artech.WCFService.ServiceService :业务逻辑

 3.  WCFService :IIS应用

 

在Artech.WCFService.Contract添加一个interface,名称叫做ICalculator。

Add : 计算2数之和

 1using System.Collections.Generic;
 2using System.Text;
 3using System.ServiceModel;
 4
 5namespace Artech.WCFService.Contract
 6{
 7    [ServiceContract]
 8    public interface ICalculator
 9    {
10        [OperationContract]
11        double Add(double x, double y);
12    }

13}

 

 在Artech.WCFService.Service添加一个Class,名称叫做Calculator。他继承了ICalculator,是ICalculator的实现。

 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4using System.ServiceModel;
 5using Artech.WCFService.Contract;
 6
 7namespace Artech.WCFService.Service
 8{
 9    public class CalculatorService:ICalculator
10    {
11
12        ICalculator Members
21    }

22}

 

 在WCFService站点中添加一个CalculatorService.svc(WCF Service)

<%@ ServiceHost Language="C#" Debug="true" Service="Artech.WCFService.Service.CalculatorService" %>

 

找到WCFService站点的配置文件web.config

<system.serviceModel>下<behaviors>添加


1      <serviceBehaviors>
2        <behavior name="calculatorServiceBehavior">
3          <serviceMetadata httpGetEnabled ="true"></serviceMetadata>
4        </behavior>
5      </serviceBehaviors>

 


<system.serviceModel>下<services>添加

1<service name="Artech.WCFService.Service.CalculatorService" behaviorConfiguration="calculatorServiceBehavior">
2  <endpoint binding="basicHttpBinding" contract="Artech.WCFService.Contract.ICalculator"></endpoint>
3</service>

 

  • <service>节点name属性,是实现了服务契约的类型名,类型名必须是完整的,要包括名称空间
  • <endpoint>节点的address属性为空,说明使用基地址.
  • behaviorConfiguration属性与behavior节点的name属性相匹配binding属性说明WCF服务使用什么协议,这里是HTTP协议contract属性是描述契约的接口名称,也必须是完整的.如果没有接口直接写实现契约的类型名也可以.
  • <behavior>节点的信息是描述WCF服务端的一些特性,行为的<behavior name="calculatorServiceBehavior"> name属性与前面说的behaviorConfiguration属性一致
如果没有客户端程序,你不能直接测试WCF 服务,就像web service 一样。Microsoft 提供了一个简单的方法来测试WCF 服务 – WcfTestClient 工具。 

 

若要找到此工具,请转到以下位置:C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\如果WCF 服务承载在WCF Service Host (WcfSvcHost.exe) ,WcfTestClient 工具将自动打开并运行。你也可以通过命令行来运行WcfTestClient 工具,脚本如下:

 

WcfTestClient http://localhost:1705/WCFService/CalculatorService.svc

http://localhost:1705/WCFService/CalculatorService.svc 是等待测试的WCF 服务地址。WcfTestClient 在左侧面板显示暴露的方法,同时在右上侧面板也可以输入参数。当输入参数后,点击Invoke 按钮,将调用指定的WCF 方法,在右下侧面板显示结果。