那些年,我们一起学WCF--(2)wcf服务契约
2012-09-11 15:22
507 查看
这一节,大家共同来学习下WCF服务的契约设计,服务契约其实就是一个接口,描述了客户端可以进行哪些操作。这一节主要探讨两个问题
1.服务契约设计
2.契约重载
1.服务契约
先来说下服务契约,服务契约就是服务器暴露一些方法,供远程客户端进行调用,如果要定义服务契约,先定义一个接口和接口方法,在接口上面使用ServiceContract进行标记,然后在方法上面使用OperationContract进行标记,只有用ServiceContract和OperationContract标记的接口才能被远程调用,
如下面的IApple接口服务
以上我们定义了一个完整的契约, 接下来我们使用上面定义的服务契约创建一个服务端项目,使用控制台程序
APP.CONFIG文件如下
启动服务器端
2.生成客户端代理
以上服务端项目创建完成后,我们使用SvcUtil.exe工具生成客户端代理
首先我们打开命令行工具,然后使用命令生成客户端代理和配置文件,指定生成文件的位置为C盘。
命令如下:
SvcUtil /language:c# /out:c:\Client.cs /config:c:\App
http://localhost:8003/ConsoleServer.Apple
如下图:
然后创建一个客户端项目,把刚刚生成的代理类和配置文件拷贝到客户端项目里面,接着在客户端引用system.servermodel调用服务器端的方法。
客户端启动代码如下:
至此,我们服务契约已经设计完成,并成功被客户端调用。效果图如下
3.契约重载
在C#等面向对象程序中,方法名称相同,参数不同的方法我们称之为重载,但是WCF属于面向服务的设计方式,不允许出现方法名称相同,参数不同的方法,
这样在运行时,如果调用了这个方法客户端会报错。所以WCF牺牲了一些面向对象的设计思想,但是我们可以通过为方法设置别名,来进行重载。
通过使用OperationContract设置方法别名,如下面的这个契约,定义了名称相同的两个方法ShopApple
这样客户端在调用的时候就使用ShopA和ShopB进行调用。
DEMO下载:http://download.csdn.net/detail/zx13525079024/4563225
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
相关文章推荐
- 那些年,我们一起学WCF--(7)PerSession实例行为
- 那些年,我们一起学WCF--(11)自定义会话
- 那些年,我们一起学WCF--(10)并发行为
- 那些年,我们一起学WCF--(8)Single实例行为
- 那些年,我们一起学WCF--(6)PerCall实例行为
- 那些年,我们一起学WCF--(7)PerSession实例行为
- 那些年,我们一起学WCF--(7)PerSession实例行为
- 那些年,我们一起学WCF--(8)Single实例行为
- 那些年,我们一起学WCF--(1)wcf初识
- 那些年,我们一起学WCF--(6)PerCall实例行为
- 那些年,我们一起学WCF--(9)会话行为
- 那些年,我们一起学WCF--(4)数据契约
- 那些年,我们一起学WCF--(3)消息通信模式
- 那些年,我们一起学WCF--(5)数据契约继承
- 那些年,我们一起学过的汇编----之子程序设计
- 那些年,我们一起学过的汇编----之中断
- 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 5.全局防护Bypass之宽字节注入
- 我的第一个项目——说说那些年我们一起写过的代码
- 那些年,我们一起学过的R语言
- 那些年我们一起错过的成功<虎狼之师>