您的位置:首页 > 其它

那些年,我们一起学WCF--(2)wcf服务契约

2012-09-11 15:22 507 查看
这一节,大家共同来学习下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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: