本节目标

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

什么是接口

认识一下接口

必须知道的接口特性

  • 接口不可以被实例化(常作为类型使用)
  • 实现类必须实现接口的所有方法(抽象类除外)
  • 实现类可以实现多个接口(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. 【夯实PHP基础】UML序列图总结

    原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...

  2. GSD_WeiXin(高仿微信)应用源码

    高仿微信计划:已经实现功能 1.微信首页(cell侧滑编辑.下拉眼睛动画.下拉拍短视频.点击进入聊天详情界面) 2.通讯录(联系人字母排序.搜索界面) 3.发现(朋友圈) 4.我(界面) 待实现功能( ...

  3. windows下mongodb配置

    打开cmd(windows键+r输入cmd)命令行,进入D:\mongodb\bin目录(如图先输入d:进入d盘然后输入cd d:\mongodb\bin), 输入如下的命令启动mongodb服务: ...

  4. python selenium

    https://segmentfault.com/a/1190000007249396?_ea=1293878

  5. LeetCode All in One 题目讲解汇总(持续更新中...)

    终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...

  6. Spark笔记:复杂RDD的API的理解(下)

    本篇接着谈谈那些稍微复杂的API. 1)   flatMapValues:针对Pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录 这个方法我最开始接 ...

  7. CanvasWebgl项目介绍

    CanvasWebgl 介绍 CanvasWebgl 是一个基于webgl 开发的2d绘图框架,使用TypeScript开发   CanvasWebgl的功能,是在屏幕空间 或者 3D空间产生一个画布 ...

  8. Code First Migrations

    在MVC开发当中难免会对类进行修改,修改后再次运行就会出现异常,提示上下文的模型已在数据库创建后发生改变. 支持“AppContext”上下文的模型已在数据库创建后发生更改.请考虑使用 Code Fi ...

  9. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  10. nodejs模块中exports和module.exports的区别

    通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名')去获取:核心 ...