WCF入门-两种方法实现重载

多看多练,慢慢入门。今天将学习的wcf中实现重载进行梳理一遍。直接上代码和注意事项吧,多的我也解释不清,去看大佬的博客。他们说的更详细。

最简单的三层结构,Client用直接服务引用的方法实现,ClientByConfig用重写服务端+配置文件的方法实现的。

 服务端代码:

就是普通的服务接口,里面两个名字相同的方法,然后用在上面加特性用于区分两个方法。

 [ServiceContract]
    public interface IService1
    {
        [OperationContract(Name="AddInt")]
        int Add(int num1, int num2);

        [OperationContract(Name="AddDouble")]
        double Add(double num1, double num2);

        // TODO: 在此添加您的服务操作
    }

服务实现:

  public class Service1 : IService1
    {

        public int Add(int num1, int num2)
        {
            return num1 + num2;
        }

        public double Add(double num1, double num2)
        {
            return num2 + num1;
        }
    }

寄宿代码和配置文件

static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(Service1)))
            {
                host.Opened += delegate
                {
                    Console.WriteLine("CalculatorService已经启动!");
                };
                //通讯状态转换到已打开
                host.Open();
                Console.ReadLine();
            }
        }
<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- 部署服务库项目时,必须将配置文件的内容添加到
 主机的 app.config 文件中。System.Configuration 不支持库的配置文件。 -->
  <system.serviceModel>
    <services>
      <service name="Service.Service1" behaviorConfiguration="Service.Service1Behavior">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8733/Design_Time_Addresses/Service/Service1/" />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- 除非完全限定,否则地址相对于上面提供的基址-->
        <endpoint address="http://192.168.10.2:8733/Design_Time_Addresses/Service/Service1/" binding="basicHttpBinding" contract="Service.IService1">
          <!--
              部署时,应删除或替换以下标识元素,以反映
              在其下运行部署服务的标识。删除之后,WCF 将
              自动推导相应标识。
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <!-- Metadata Endpoints -->
        <!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 --> 
        <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除 -->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Service.Service1Behavior">
          <!-- 为避免泄漏元数据信息,
          请在部署前将以下值设置为 false -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- 要接收故障异常详细信息以进行调试,
          请将以下值设置为 true。在部署前
            设置为 false 可避免泄漏异常信息 -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

服务端就这些东西,跟平时用的都差不多,就是多了个特性,用来区分两个方法。下面介绍客户端的两种实现方法。

第一种:

直接应用,就是直接服务启动以后,直接添加服务引用,这样生成以后可以更直观的看到里面的内容区分。

直接引用会自动生成一个配置文件 ,这个就不贴出来了。

自己点开看看,区别在哪里。 这两个其实就是你前面写的特性的名字,客户端引用以后被重写了。

控制台代码:

 static void Main(string[] args)
        {
            Service1Client service = new Service1Client();
            Console.WriteLine("结果:{0}",service.AddInt(12, 12));
            Console.Read();
        }

第一种方法就结束了,可以很清楚的看到,类似于把服务端的方法进行了重写。重写的方法名就是特性上面的名称。 

第二种:

第二种其实更简单,或者说更符合C#的那种。类似于把服务端重写一遍,但是有区分,新手一定要注意。这个名字的指向还是服务端的名称。这个接口重新起个名字。

 

服务实现:

 

 public class MyServiceClient : ClientBase<ImyService>, ImyService
    {
        public int Add(int num1, int num2)
        {
            return Channel.Add(num1, num2);
        }

        public double Add(double num1, double num2)
        {
            return Channel.Add(num1, num2);
        }
    }

创建客户端配置文件:

我不是创建的,我是把上个方法自动生成的拷贝过来的,然后有个地方要进行修改。这个一定要对应为客户端的服务,不然会报错。

控制台代码:

 static void Main(string[] args)
        {
            MyServiceClient serviceClient = new MyServiceClient();
            Console.WriteLine("结果:{0}", serviceClient.Add(12,12));
            Console.Read();
        }

这就结束了。得到的结果其实是一样的,第二种方法貌似更符合以前的那种方式,因为方法的名字并没有被修改,只要传入不同的参数就能识别。建议使用第二种。源代码,自己写的也是为了挣点积分,以后学习别人的能用的,有大佬的话,送点积分,哈哈。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

90e家

有C币的小伙伴可以贡献一点,哈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值