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

       这一节,大家共同来学习下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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值