一、Visual Studi 2013环境下,新建WCF服务
1、新建一个空白解决方案,解决方案名称为“WCFSolution”。
2、解决方案右键->添加->WCF->WCF服务库,类库名称为CalculateWcfService。
3、创建服务契约
WCF采用基于契约的交互方式实现了服务的自制。服务契约是相关操作的集合。契约就是双方或多方就某个关注点达成的一种共识,是一方向另一方的一种承诺。签署了某个契约就意味着自己有义务履行契约中的各项规定,一旦违约势必影响契约双方的正常交互。我们主张通过抽象将接口和实现相互分离,鼓励接口的依赖,避免基于实现的依赖。接口是稳定的,而实现则是易变的,基于接口的服务调用能够更有效地应对实现的变化带来的影响。接口从本质上讲就是一种契约,当某个类实现了某个接口,就相对于签署了一份契约。所以契约关心的是“我能做到”,不在于“我如何做到”。所以,服务契约是以接口的形式进行定义的。
下面的代码中,定义了一个接口,通过在接口上应用System.ServiceModel命名空间下的ServiceContractAttribute特性将ICalculateService接口定义成服务契约。在应用ServiceContractAttribute特性的同时,还可以指定服务契约的名称和命名空间。每个服务契约都有一个确定的名称,当在一个接口上应用了该属性以后,默认的名称就是接口的名称。我们可以通过Name属性显示地指定需要的名称。
NameSpace:服务契约的命名空间,其作用是解决命名冲突的问题,提倡将你所在的公司名称或项目名称的URN作为命名空间。WCF默认的命名空间是:http://tempuri.org/。
服务契约是一组相关服务操作的集合,当我们在一个接口上应用了ServiceContractAttribute,便赋予了服务契约的属性。但是,对于这样一个类型,它的成语并不会自动成为契约的服务操作,只有应用了OperationContractAttribute特性后,相应的方法成员才能成为能够通过服务调用方式访问的服务操作。
CalculateWcfService.ICalculateService
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace CalculateWcfService
{
/// <summary>
/// 定义服务契约:通过接口实现契约
/// </summary>
[ServiceContract(Name = "CalculateService")]
public interface ICalculateService
{
/// <summary>
/// 定义操作契约
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
[OperationContract(Name = "AddOperation")]
double AddOperation(double num1, double num2);
/// <summary>
/// 定义操作契约
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
[OperationContract(Name = "SubOperation")]
double SubOperation(double num1, double num2);
/// <summary>
/// 定义操作契约
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
[OperationContract(Name = "MulOperation")]
double MulOperation(double num1, double num2);
/// <summary>
/// 定义操作契约
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
[OperationContract(Name = "DivOperation")]
double DivOperation(double num1, double num2);
}
}
4、创建服务:新建一个类,实现第3步中创建的接口
当服务契约成功创建时,我们需要通过实现服务契约来创建具体的WCF服务。WCF服务CalculateService实现了服务契约接口ICalculateService,实现了接口里面定义的所有服务操作。
ICalculateService.CalculateService
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace CalculateWcfService
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
public class CalculateService : ICalculateService
{ /// <summary>
/// 加
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
public double AddOperation(double num1, double num2)
{
return num1 + num2;
}
/// <summary>
/// 减
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
public double SubOperation(double num1, double num2)
{
return num1 - num2;
}
/// <summary>
/// 乘
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
public double MulOperation(double num1, double num2)
{
return num1 * num2;
}
/// <summary>
/// 除
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
public double DivOperation(double num1, double num2)
{
return num1 / num2;
}
}
}
App.Config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" />
</system.web>
<!-- 部署服务库项目时,必须将配置文件的内容添加到
主机的 app.config 文件中。System.Configuration 不支持库的配置文件。-->
<system.serviceModel>
<services>
<service name="CalculateWcfService.CalculateService">
<endpoint address="" binding="basicHttpBinding" contract="CalculateWcfService.ICalculateService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8733/Design_Time_Addresses/CalculateWcfService/CalculateService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- 为避免泄漏元数据信息,
请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
<!-- 要接收故障异常详细信息以进行调试,
请将以下值设置为 true。在部署前设置为 false
以避免泄漏异常信息-->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>