WCF入门教程2——创建第一个WCF程序
本节目标
- 掌握接口
- 理解契约式编程
- 创建宿主程序
- 创建客户端程序访问服务
什么是接口
认识一下接口
必须知道的接口特性
- 接口不可以被实例化(常作为类型使用)
- 实现类必须实现接口的所有方法(抽象类除外)
- 实现类可以实现多个接口(Java,C#中的多继承)
- 接口中的变量都是静态常量
理解接口
定义一个接口是为了遵循同一种规范,便于程序的扩展。
接口是一种能力
接口是一种约定
关键字
Interface
public
abstract
理解契约式编程
契约合同能保障双方的利益,对客户来说,合同规定了供应者要做的工作;对供应者来说,合同说明了如果约定的条件不满足,供应者没有义务一定要完成规定的任务。该道理同样也适用于软件. 所以,契约式编程是编程的一种方法。

引入契约观念之后,这种Client 与 Server 关系被打破,大家都是平等的,你需要我正确提供服务,那么你必须满足我提出的条件,否则我没有义务“排除万难”地保证完成任务。
WCF服务契约
服务契约描述了暴露给外部的类型(接口或类)、服务所支持的操作、使用的消息交换模式和消息的格式。每个WCF服务必须实现至少一个服务契约。使用服务契约必须要引用命名空间System.ServiceModel 。
ServiceContractAttribute:该特性可被用来作用于子类或者接口之上,并允许重复声明。
OperationContractAttribute:只有定义了该特性的方法才会被放入服务之中。
1、新建服务程序
新建项目——类库,这里我们先不直接新建一个WCF服务,而是新建一个类库,命名为HelloService
添加引用
删除Class1.cs,然后新建一个接口IHelloService.cs:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.ServiceModel; //添加命名空间,这是WCF的核心库
- namespace HelloService
- {
- [ServiceContract]
- public interface IHelloService
- {
- [OperationContract]
- string SayHello(string name);
- }
- }
添加HelloService类:
- public class HelloService:IHelloService
- {
- public string SayHello(string name)
- {
- return "你好,我是:" + name;
- }
- }
ServiceHost类型:当IIS活WAS作为宿主程序时,IIS和WAS会自动创建ServiceHost类型。
手动创建的基本语法:public ServiceHost(Type serviceType,params Uri[] baseAddresses);
2、新建宿主
新建项目——控制台应用程序
然后添加System.ServiceModel引用,和项目引用HelloService,引用之前的类库项目。
HelloServiceHost 项目中Program.cs代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.ServiceModel;
- using System.ServiceModel.Channels; //使用到了绑定
- namespace HelloServiceHost
- {
- class Program
- {
- static void Main(string[] args)
- {
- using (MyHelloHost host=new MyHelloHost())
- {
- host.Open();
- Console. Console.ReadLine();
- }
- }
- }
- public class MyHelloHost:IDisposable
- {
- /// <summary>
- /// 定义一个服务对象
- /// </summary>
- private ServiceHost _myHelloHost;
- public const string BaseAddress = "net.pipe://localhost"; //基地址
- public const string HelloServiceAddress = "Hello"; //可选地址
- public static readonly Type ServiceType =typeof(HelloService.HelloService); //服务契约实现类型
- public static readonly Type ContractType =typeof(HelloService.IHelloService); //服务契约接口
- public static readonly Binding HelloBinding = new NetNamedPipeBinding(); //服务定义一个绑定
- /// <summary>
- /// 构造方法
- /// </summary>
- public MyHelloHost()
- {
- CreateHelloServiceHost();
- }
- /// <summary>
- /// 构造服务对象
- /// </summary>
- protected void CreateHelloServiceHost()
- {
- _myHelloHost = new ServiceHost(ServiceType, new Uri[] { new Uri(BaseAddress) });//创建服务对象
- _myHelloHost.AddServiceEndpoint(ContractType, HelloBinding,HelloServiceAddress); //添加终结点
- }
- /// <summary>
- /// 打开服务方法
- /// </summary>
- public void Open()
- {
- Console.WriteLine("开始启动服务...");
- _myHelloHost.Open();
- Console.WriteLine("服务已启动");
- }
- /// <summary>
- /// 销毁服务宿主对象实例
- /// </summary>
- public void Dispose()
- {
- if (_myHelloHost != null)
- (_myHelloHost asIDisposable).Dispose();
- }
- }
- }
3、新建客户端调用程序
新建项目——控制台应用程序
HelloClient项目中Program.cs代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.ServiceModel;
- using System.ServiceModel.Channels;
- using HelloService;
- namespace HelloClient
- {
- class Program
- {
- static void Main(string[] args)
- {
- using(HelloProxy proxy=new HelloProxy())
- {
- //利用代理调用方法
- Console.WriteLine(proxy.Say("郑少秋"));
- Console.ReadLine();
- }
- }
- }
- [ServiceContract]
- interface IService
- {
- [OperationContract]
- string Say(string name);
- }
- class HelloProxy:ClientBase<IHelloService>,IService
- {
- public static readonly Binding HelloBinding = new NetNamedPipeBinding(); //硬编码定义绑定
- //硬编码定义地址 注意:这里要和之前服务定义的地址保持一直
- public static readonly EndpointAddress HelloAddress =new EndpointAddress(new Uri("net.pipe://localhost/Hello"));
- public HelloProxy() : base(HelloBinding,HelloAddress) { } //构造方法
- public string Say(string name)
- {
- //使用Channel属性对服务进行调用
- return Channel.SayHello(name);
- }
- }
- }
先运行HelloServiceHost
然后运行HelloClient
WCF入门教程2——创建第一个WCF程序的更多相关文章
- 【ASP.NET 基础】WCF入门教程一(什么是WCF)?
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- WCF入门教程(二)如何创建WCF服务
WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...
- 无废话WCF入门教程六[一个简单的Demo]
一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...
- WCF入门教程(二)从零做起-创建WCF服务
通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) 定义了协议,具体什么操作,操作的参数和返回值 ...
- 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代码方式来 ...
- 【转】WCF入门教程六[一个简单的Demo]
一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...
- 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 ...
- WCF入门教程(四)通过Host代码方式来承载服务
WCF入门教程(四)通过Host代码方式来承载服务 之前已经讲过WCF对外发布服务的具体方式. WCF入门教程(一)简介 Host承载,可以是web,也可以是控制台程序等等.比WebService有更 ...
- WCF入门教程(一)简介
WCF入门教程(一)简介 1.WCF是什么? WCF( Windows Communication Foundation), 是Microsoft为构建面向服务的应用提供的分布式通信编程框架,是.NE ...
随机推荐
- 【架构设计】分布式文件系统 FastDFS的原理和安装使用
本文地址 分享提纲: 1.概述 2. 原理 3. 安装 4. 使用 5. 参考文档 1. 概述 1.1)[常见文件系统] Google了一下,流行的开源分布式文件系统有很多,介绍如下: -- mo ...
- 使用Git Bash远程添加分支和简单部署你的静态页面
新建一个分支:git branch mybranch(mybranch你的分支名字) 切换到你的新分支: git checkout mybranch 将新分支发布在github上: git push ...
- BPM合同管理解决方案分享
一.方案概述合同是组织与组织间所订协议的法律 表现形式,体现着双方对于合作在法律和道德上的承诺.然而,大多数企业的合同管理都或多或少存在合同审批过程不规范.签订草率.审批权责不清.合同执行跟踪难.合同 ...
- Android——eclipse下运行android项目报错 Conversion to Dalvik format failed with error 1解决
在eclipse中导入android项目,项目正常没有任何错误,但是运行时候会报错,(clean什么的都没用了.....)如图: 百度大神大多说是jdk的问题,解决: 右键项目-Properties如 ...
- 在开源中国(oschina)git中新建标签(tags)
我今天提交代码到主干上面,本来想打个标签(tags)的. 因为我以前新建过标签(tags),但是我现在新建的时候不知道入库在哪了.怎么找也找不到了. 从网上找资料也没有,找客服没有人理我,看到一个交流 ...
- MongoDB学习笔记四—增删改文档下
$slice 如果希望数组的最大长度是固定的,那么可以将 $slice 和 $push 组合在一起使用,就可以保证数组不会超出设定好的最大长度.$slice 的值必须是负整数. 假设$slice的值为 ...
- 2-1 Linux 操作系统及常用命令
根据马哥linux初级视频 2-1.2-2来编辑 1. GUI与CLI GUI: Graphic User Interface CLI: Command Line Interface 注:在Windo ...
- 《Note --- Unreal --- MemPro (CONTINUE... ...)》
Mem pro 是一个主要集成内存泄露检测的工具,其具有自身的源码和GUI,在GUI中利用"Launch" button进行加载自己待检测的application,目前支持的平台为 ...
- .NET面试题系列[2] - .NET框架基础知识(2)
3 程序集 面试出现频率:虽然很重要但不怎么出现,可能会考你定义,以及程序集包括什么,然后自然的话题就跑到反射上去了. 重要程度:8/10,很重要 需要理解的程度:知道程序集包括IL和元数据.知道元数 ...
- HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术
最近做项目在前端我使用了很多新技术,这些技术有bootstrap.angularjs,不过最让我兴奋的还是使用了HTML5的技术,今天我想总结一些HTML5的技术,好记性不如烂笔头,写写文章可以很好的 ...