这一节,大家共同来学习下WCF服务的契约设计,服务契约其实就是一个接口,描述了客户端可以进行哪些操作。这一节主要探讨两个问题
1.服务契约设计
2.契约重载
1.服务契约
先来说下服务契约,服务契约就是服务器暴露一些方法,供远程客户端进行调用,如果要定义服务契约,先定义一个接口和接口方法,在接口上面使用ServiceContract进行标记,然后在方法上面使用OperationContract进行标记,只有用ServiceContract和OperationContract标记的接口才能被远程调用,
如下面的IApple接口服务
[ServiceContract]
public interface IApple
{
[OperationContract]
string OrderApple();
[OperationContract]
string GetApple();
}
public class Apple:IApple
{
#region IApple 成员
public string OrderApple()
{
return "我订购苹果!";
}
public string GetApple()
{
return "我得到了苹果!";
}
#endregion
}
以上我们定义了一个完整的契约, 接下来我们使用上面定义的服务契约创建一个服务端项目,使用控制台程序
APP.CONFIG文件如下
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="ConsoleServer.Apple" behaviorConfiguration="beconfig">
<endpoint address="http://localhost:8003/ConsoleServer.Apple" contract="ConsoleServer.IApple" binding="wsHttpBinding" >
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="beconfig">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8003/ConsoleServer.Apple"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
启动服务器端
class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(Apple));
host.Open();
Console.WriteLine("服务器端启动成功....");
Console.ReadLine();
}
}
2.生成客户端代理
以上服务端项目创建完成后,我们使用SvcUtil.exe工具生成客户端代理
首先我们打开命令行工具,然后使用命令生成客户端代理和配置文件,指定生成文件的位置为C盘。
命令如下:
SvcUtil /language:c# /out:c:\Client.cs /config:c:\App http://localhost:8003/ConsoleServer.Apple
如下图:
然后创建一个客户端项目,把刚刚生成的代理类和配置文件拷贝到客户端项目里面,接着在客户端引用system.servermodel调用服务器端的方法。
客户端启动代码如下:
class Program
{
static void Main(string[] args)
{
using (ChannelFactory<IApple> channelFactory = new ChannelFactory<IApple>("WSHttpBinding_IApple"))
{
IApple apple = channelFactory.CreateChannel();
string result = apple.GetApple();
Console.WriteLine("客户端获取信息如下:");
Console.WriteLine(result);
Console.ReadLine();
}
}
至此,我们服务契约已经设计完成,并成功被客户端调用。效果图如下
3.契约重载
在C#等面向对象程序中,方法名称相同,参数不同的方法我们称之为重载,但是WCF属于面向服务的设计方式,不允许出现方法名称相同,参数不同的方法,
这样在运行时,如果调用了这个方法客户端会报错。所以WCF牺牲了一些面向对象的设计思想,但是我们可以通过为方法设置别名,来进行重载。
通过使用OperationContract设置方法别名,如下面的这个契约,定义了名称相同的两个方法ShopApple
[ServiceContract]
public interface IApple
{
[OperationContract]
string OrderApple();
[OperationContract]
string GetApple();
[OperationContract(Name="ShopB")]
string ShopApple();
[OperationContract(Name="ShopA")]
string ShopApple(string msg);
}
这样客户端在调用的时候就使用ShopA和ShopB进行调用。
DEMO下载:http://download.csdn.net/detail/zx13525079024/4563225