使用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中,契约分为四种,它们分别为:
-
用于定义服务操作的服务契约:Service Contract
这种级别的契约又包括两种:ServiceContract和OperationContract
ServiceContract用于类或者结构上,用于指示WCF此类或者结构能够被远程调用,而OperationContract用于类中的方法(Method)上,用于指示WCF该方法可被远程调用。
-
用于自定义数据结构的数据契约:Data Contract
数据契约也分为两种:DataContract和DataMember.DataContract用于类或者结构上,指示 WCF此类或者结构能够被序列化并传输,而DataMember只能用在类或者结构的属性(Property)或者字段(Field)上,指示WCF该属性或者字段能够被序列化传输。
-
用于自定错误异常的异常契约:Fault Contract
FaultContract用于自定义错误异常的处理方式,默认情况下,当服务端抛出异常的时候,客户端能接收到异常信息的描述,但这些描述往往格式统一,有时比较难以从中获取有用的信息,此时,我们可以自定义异常消息的格式,将我们关心的消息放到错误消息中传递给客户端,此时需要在方法上添加自定义一个错误消息的类,然后在要处理异常的函数上加上FaultContract,并将异常信息指示返回为自定义格式。
-
用于控制消息格式的消息契约:Message Contract
简单的说,它能自定义消息格式,包括消息头,消息体,还能指示是否对消息内容进行加密和签名。
2. Artech.WCFService.ServiceService :业务逻辑
3. WCFService :IIS应用
在Artech.WCFService.Contract添加一个interface,名称叫做ICalculator。
Add : 计算2数之和
1
using
System.Collections.Generic;
2
using
System.Text;
3
using
System.ServiceModel;
4
5
namespace
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的实现。
1
using
System;
2
using
System.Collections.Generic;
3
using
System.Text;
4
using
System.ServiceModel;
5
using
Artech.WCFService.Contract;
6
7
namespace
Artech.WCFService.Service
8
{
9 public class CalculatorService:ICalculator
10 {
11
12 ICalculator Members#region ICalculator Members
13
14 public double Add(double x, double y)
15 {
16
17 return x + y;
18 }
19
20 #endregion
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 方法,在右下侧面板显示结果。