本节目标

  • 掌握接口
  • 理解契约式编程
  • 创建宿主程序
  • 创建客户端程序访问服务

什么是接口

认识一下接口

必须知道的接口特性

  • 接口不可以被实例化(常作为类型使用)
  • 实现类必须实现接口的所有方法(抽象类除外)
  • 实现类可以实现多个接口(Java,C#中的多继承)
  • 接口中的变量都是静态常量

理解接口

定义一个接口是为了遵循同一种规范,便于程序的扩展。
接口是一种能力
接口是一种约定
关键字
Interface
public
abstract

理解契约式编程

契约合同能保障双方的利益,对客户来说,合同规定了供应者要做的工作;对供应者来说,合同说明了如果约定的条件不满足,供应者没有义务一定要完成规定的任务。该道理同样也适用于软件. 所以,契约式编程是编程的一种方法。

引入契约观念之后,这种Client 与 Server 关系被打破,大家都是平等的,你需要我正确提供服务,那么你必须满足我提出的条件,否则我没有义务“排除万难”地保证完成任务。

WCF服务契约

服务契约描述了暴露给外部的类型(接口或类)、服务所支持的操作、使用的消息交换模式和消息的格式。每个WCF服务必须实现至少一个服务契约。使用服务契约必须要引用命名空间System.ServiceModel 。

ServiceContractAttribute:该特性可被用来作用于子类或者接口之上,并允许重复声明。

OperationContractAttribute:只有定义了该特性的方法才会被放入服务之中。

1、新建服务程序

新建项目——类库,这里我们先不直接新建一个WCF服务,而是新建一个类库,命名为HelloService

添加引用

删除Class1.cs,然后新建一个接口IHelloService.cs:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ServiceModel; //添加命名空间,这是WCF的核心库
  6. namespace HelloService
  7. {
  8. [ServiceContract]
  9. public interface IHelloService
  10. {
  11. [OperationContract]
  12. string SayHello(string name);
  13. }
  14. }

添加HelloService类:

  1. public class HelloService:IHelloService
  2. {
  3. public string SayHello(string name)
  4. {
  5. return "你好,我是:" + name;
  6. }
  7. }

ServiceHost类型:当IIS活WAS作为宿主程序时,IIS和WAS会自动创建ServiceHost类型。

手动创建的基本语法:public ServiceHost(Type serviceType,params Uri[] baseAddresses);

2、新建宿主

新建项目——控制台应用程序

然后添加System.ServiceModel引用,和项目引用HelloService,引用之前的类库项目。

HelloServiceHost 项目中Program.cs代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ServiceModel;
  6. using System.ServiceModel.Channels; //使用到了绑定
  7. namespace HelloServiceHost
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. using (MyHelloHost host=new MyHelloHost())
  14. {
  15. host.Open();
  16. Console. Console.ReadLine();
  17. }
  18. }
  19. }
  20. public class MyHelloHost:IDisposable
  21. {
  22. /// <summary>
  23. /// 定义一个服务对象
  24. /// </summary>
  25. private ServiceHost _myHelloHost;
  26. public const string BaseAddress = "net.pipe://localhost"; //基地址
  27. public const string HelloServiceAddress = "Hello"; //可选地址
  28. public static readonly Type ServiceType =typeof(HelloService.HelloService);  //服务契约实现类型
  29. public static readonly Type ContractType =typeof(HelloService.IHelloService);  //服务契约接口
  30. public static readonly Binding HelloBinding = new NetNamedPipeBinding(); //服务定义一个绑定
  31. /// <summary>
  32. /// 构造方法
  33. /// </summary>
  34. public MyHelloHost()
  35. {
  36. CreateHelloServiceHost();
  37. }
  38. /// <summary>
  39. /// 构造服务对象
  40. /// </summary>
  41. protected void CreateHelloServiceHost()
  42. {
  43. _myHelloHost = new ServiceHost(ServiceType, new Uri[] { new Uri(BaseAddress) });//创建服务对象
  44. _myHelloHost.AddServiceEndpoint(ContractType, HelloBinding,HelloServiceAddress); //添加终结点
  45. }
  46. /// <summary>
  47. /// 打开服务方法
  48. /// </summary>
  49. public void Open()
  50. {
  51. Console.WriteLine("开始启动服务...");
  52. _myHelloHost.Open();
  53. Console.WriteLine("服务已启动");
  54. }
  55. /// <summary>
  56. /// 销毁服务宿主对象实例
  57. /// </summary>
  58. public void Dispose()
  59. {
  60. if (_myHelloHost != null)
  61. (_myHelloHost asIDisposable).Dispose();
  62. }
  63. }
  64. }

3、新建客户端调用程序

新建项目——控制台应用程序

HelloClient项目中Program.cs代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ServiceModel;
  6. using System.ServiceModel.Channels;
  7. using HelloService;
  8. namespace HelloClient
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. using(HelloProxy proxy=new HelloProxy())
  15. {
  16. //利用代理调用方法
  17. Console.WriteLine(proxy.Say("郑少秋"));
  18. Console.ReadLine();
  19. }
  20. }
  21. }
  22. [ServiceContract]
  23. interface IService
  24. {
  25. [OperationContract]
  26. string Say(string name);
  27. }
  28. class HelloProxy:ClientBase<IHelloService>,IService
  29. {
  30. public static readonly Binding HelloBinding = new NetNamedPipeBinding();  //硬编码定义绑定
  31. //硬编码定义地址 注意:这里要和之前服务定义的地址保持一直
  32. public static readonly EndpointAddress HelloAddress =new EndpointAddress(new Uri("net.pipe://localhost/Hello"));
  33. public HelloProxy() : base(HelloBinding,HelloAddress) { } //构造方法
  34. public string Say(string name)
  35. {
  36. //使用Channel属性对服务进行调用
  37. return Channel.SayHello(name);
  38. }
  39. }
  40. }

先运行HelloServiceHost

然后运行HelloClient

WCF入门教程2——创建第一个WCF程序的更多相关文章

  1. 【ASP.NET 基础】WCF入门教程一(什么是WCF)?

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  2. WCF入门教程(二)如何创建WCF服务

    WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...

  3. 无废话WCF入门教程六[一个简单的Demo]

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

  4. WCF入门教程(二)从零做起-创建WCF服务

    通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) 定义了协议,具体什么操作,操作的参数和返回值 ...

  5. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  6. 【转】WCF入门教程六[一个简单的Demo]

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

  7. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

  8. WCF入门教程(四)通过Host代码方式来承载服务

    WCF入门教程(四)通过Host代码方式来承载服务 之前已经讲过WCF对外发布服务的具体方式. WCF入门教程(一)简介 Host承载,可以是web,也可以是控制台程序等等.比WebService有更 ...

  9. WCF入门教程(一)简介

    WCF入门教程(一)简介 1.WCF是什么? WCF( Windows Communication Foundation), 是Microsoft为构建面向服务的应用提供的分布式通信编程框架,是.NE ...

随机推荐

  1. The Zen of Python

    Beautiful is better than ugly. 优美总比丑陋好Explicit is better than implicit. 直率总比含蓄好Simple is better than ...

  2. 「译」JUnit 5 系列:环境搭建

    原文地址:http://blog.codefx.org/libraries/junit-5-setup/ 原文日期:15, Feb, 2016 译文首发:Linesh 的博客:环境搭建 我的 Gith ...

  3. 敏捷测试模式之Scrum及其实践

    一.    敏捷开发模式简介 敏捷是近年来软件研发领域很火的一个词,采用敏捷开发模式的研发团队是越来越多了,尤其是敏捷模式中的Scrum更是佼佼者大行其道,这表明敏捷模式确有其好处,能给企业带来效率的 ...

  4. [django]数据导出excel升级强化版(很强大!)

    不多说了,原理采用xlwt导出excel文件,所谓的强化版指的是实现在网页上选择一定条件导出对应的数据 之前我的博文出过这类文章,但只是实现导出数据,这次左思右想,再加上网上的搜索,终于找出方法实现条 ...

  5. PADS Layout 颜色设置

    一.板框.装配线.标注线配置: 二.个人爱好,我一般把Top pads设置成为浅绿色,Top Trace/vias/2D Line/Text/Cooper设置成为深绿色,Error设置成为黄色,而Bo ...

  6. 理解Storm并发

    作者:Jack47 PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 注:本文主要内容翻译自understanding-the-parall ...

  7. Linux学习日记(二)

    在linux上运行.Net程序 并安装Linux网站 一.环境 ubuntu14.10(桌面版 官网下载的最新版) jexus5.6.3 正式版 MonoDevloper (安装完后里面有个Ubunt ...

  8. [Intel Edison开发板] 04、Edison开发基于nodejs和redis的服务器搭建

    一.前言 intel-iot-examples-datastore 是Intel提供用于所有Edison开发板联网存储DEMO所需要的服务器工程.该工程是基于nodejs和redis写成的一个简单的工 ...

  9. C#对WebApi数据操作

    目标 简化并统一程序获取WebApi对应实体数据的过程,方便对实体进行扩充.原理就是数据服务使用反射发现数据提供者,处理好泛型就行. 相关传送门:Restful WebApi开发实践 先来看下最后的请 ...

  10. ABP源码分析四十七:ABP中的异常处理

    ABP 中异常处理的思路是很清晰的.一共五种类型的异常类. AbpInitializationException用于封装ABP初始化过程中出现的异常,只要抛出AbpInitializationExce ...