WCF 学习总结1 -- 简单实例
从VS2005推出WCF以来,WCF逐步取代了Remoting, WebService成为.NET上分布式程序的主要技术。WCF统一的模型整合了以往的 WebService、Remoting、MSMQ 等技术,让分布式开发变得更加简单,方便,快捷。

(上图选自《Programming WCF Services》)
WCF基本概念(ABC): 1.地址(Address):决定服务的地址;2.绑定(Binding):决定服务的细节;3.契约(Contract):服务的定义(抽象),决定消息结构的定义。
WCF的发布:WCF服务的发布可以有几种形式: IIS, Windows Service, Self-Host(可以是Console程序也可以是Winform程序)。
WCF的工具: Windows Communication Foundation 工具
简单实例-1: 内置AppDomain (无配置)
1. Service1.cs
- namespace WCFStudy1
- {
- [ServiceContract]
- public interface IService1
- {
- [OperationContract]
- string SendMessage(string clientInput);
- }
- public class Service1 : IService1
- {
- #region IService1 Members
- public string SendMessage(string clientInput)
- {
- return string.Format("Server Get Message: {0}", clientInput);
- }
- #endregion
- }
- }
2. Program.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.ServiceModel;
- namespace WCFStudy1
- {
- class Program
- {
- static void Main(string[] args)
- {
- // 创建一个独立AppDomain作为服务端。
- AppDomain.CreateDomain("Server1").DoCallBack(delegate
- {
- ServiceHost host = new ServiceHost(typeof(Service1));
- host.AddServiceEndpoint(typeof(IService1), //契约(C)
- new BasicHttpBinding(), //绑定(B)
- "http://localhost:9999/myservice"); //地址(A)
- host.Open();
- });
- // 下面是客户端
- ChannelFactory<IService1> factory = new ChannelFactory<IService1>(
- new BasicHttpBinding(),
- "http://localhost:9999/myservice");
- IService1 client = factory.CreateChannel();
- var reply = client.SendMessage("Hello WCF");
- Console.WriteLine(reply);
- Console.Read();
- }
- }
- }
如图所示:

简单实例-2: 创建 Console Self-Host

WcfServiceLib - 服务契约的实现; *ConsoleHost工程 – Wcf宿主; *ConsoleClient工程 - Wcf客户端
- 创建WcfServiceLib工程(选WCF Service Library工程模板: VS为我们自动添加一个IService1.cs和Service1.cs)

- Host工程里引用WcfServiceLib工程

- 将WcfServiceLib里App.config移动到ConsoleHost工程里,删掉Lib工程里的App.config

- Host工程的Program.cs添加下面的代码,右击Builder工程
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.ServiceModel;
- using WcfServiceLib;
- namespace WCFStudy2ConsoleHost
- {
- class Program
- {
- static void Main(string[] args)
- {
- using(var host = new ServiceHost(typeof(Service1)))
- {
- host.Open();
- Console.WriteLine("Service start.");
- Console.Read();
- }
- }
- }
- }
- 运行 ConsoleHost工程 bin/debug 下面的 exe(这一步是为了生成客户端代理,需要启动Host)
- 在Client工程里通过添加 Service References,生成客户端Proxy,关闭exe

- 在Client工程的Program.cs里添加如下代码。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace WCFStudy2ConsoleClient
- {
- class Program
- {
- static void Main(string[] args)
- {
- MyWcfSvc.Service1Client client = new MyWcfSvc.Service1Client();
- var result = client.GetData(123);
- Console.WriteLine(result);
- Console.Read();
- }
- }
- }
- F5 运行Solution里的Host, 再右击Client工程选Debug的Start new instance方式,运行Client
运行结果:

由于ServiceHost实例是被创建在应用程序域中,必须保证宿主进程在调用服务期间不会被关闭,因此利用Console.Read()来阻塞进程,以使得控制台应用程序能够一直运行,直到人为关闭应用程序。
简单实例-3: 创建 Winform Self-Host
Winform的Self-Host和ConsoleHost类似,先添加 WcfServiceLib 工程引用,将 WcfServiceLib 里的App.config 移到 Winform 工程里。加上启动Service的代码就OK了!
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- private ServiceHost host = null;
- // 开启服务端
- private void btnStart_Click(object sender, EventArgs e)
- {
- try
- {
- if (host != null)
- host.Close();
- host = new ServiceHost(typeof(WcfServiceLib.Service1));
- host.Open();
- this.textBox1.Text = "Server Opened!";
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.ToString());
- if (host != null)
- host.Close();
- }
- }
- // 关闭服务端
- private void btnStop_Click(object sender, EventArgs e)
- {
- if (host != null)
- {
- host.Close();
- this.textBox1.Text += "Server Closed!";
- }
- }
- }

在Winform中,不要使用 using(...) 代码块,这将导致在Button方法结束后自动销毁Host对象而关闭服务。
简单实例-4: 创建 Windows Service Host
Windows Services宿主便于管理者方便地启动或停止服务,且在服务出现故障之后,能够重新启动服务。还可以通过Service Control Manager(服务控制管理器),将服务设置为自动启动方式,省去了服务的管理工作。此外,Windows Services自身还提供了一定的安全性以及检测机制和日志机制。
1. 创建Windows Service工程

2. 引用 WcfServiceLib 工程,添加 App.config (和前面Host添加的App.config一样)
3. 重写 WindowsService 类的 OnStart 和 OnStop 方法
- public partial class Service1 : ServiceBase
- {
- public Service1()
- {
- InitializeComponent();
- }
- private ServiceHost host = null;
- protected override void OnStart(string[] args)
- {
- if (host != null)
- host.Close();
- host = new ServiceHost(typeof(WcfServiceLib.Service1));
- host.Open();
- }
- protected override void OnStop()
- {
- if (host != null)
- host.Close();
- }
- }
4. 创建Service的安装类:在WindowsService 类的设计界面上右击选择 [Add Installer]

修改 serviceProcessInstaller 的 Account 属性 (默认为User) 改为 LocalSystem

通过在Visual Studio的 [Command Prompt] (命令行)模式下通过 InstallUtil 工具安装 Windows服务:
InstallUtil [绝对路径]/WCFStudy2WindowsServiceHost.exe (安装成功之后,使用Services.msc查看服务)

简单实例-5: 创建 IIS Host
最简单的就是直接创建一个 WCF Service Application 就OK了。

以上所有工程的关系图如下:

WCF 学习总结1 -- 简单实例的更多相关文章
- WCF学习——构建一个简单的WCF应用(一)
本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些准备开始学习WCF的初学者提供一些帮助. 在这个例子中,我们将实现一个简单的计算器和传统的分布式通信框架一样,WC ...
- WCF学习——构建一个简单的WCF应用(二)
我们接着上一篇文章进行讲解 http://www.cnblogs.com/songjianhui/p/7060698.html 一:客户端通过添加引用调用服务 WCF应用服务被成功寄宿后,WCF服务应 ...
- 关于深度学习之TensorFlow简单实例
1.对TensorFlow的基本操作 import tensorflow as tf import os os.environ[" a=tf.constant(2) b=tf.constan ...
- WCF 学习总结2 -- 配置WCF
前面一篇文章<WCF 学习总结1 -- 简单实例>一股脑儿展示了几种WCF部署方式,其中配置文件(App.config/Web.config)都是IDE自动生成,省去了我们不少功夫.现在回 ...
- Django学习笔记(一):环境安装与简单实例
Django学习笔记(一):环境安装与简单实例 通过本文章实现: Django在Windows中的环境安装 Django项目的建立并编写简单的网页,显示欢迎语与当前时间 一.环境安装 结合版本兼容性等 ...
- WCF学习之旅—HTTP双工模式(二十)
WCF学习之旅—请求与答复模式和单向模式(十九) 四.HTTP双工模式 双工模式建立在上文所实现的两种模式的基础之上,实现客户端与服务端相互调用:前面介绍的两种方法只是在客户端调用服务端的方法,然后服 ...
- WCF学习笔记之事务编程
WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...
- WCF学习笔记之传输安全
WCF学习笔记之传输安全 最近学习[WCF全面解析]下册的知识,针对传输安全的内容做一个简单的记录,这边只是简单的记录一些要点:本文的内容均来自[WCF全面解析]下册: WCF的传输安全主要涉及认证. ...
- WCF学习之旅—WCF服务部署到IIS7.5(九)
上接 WCF学习之旅—WCF寄宿前的准备(八) 四.WCF服务部署到IIS7.5 我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以 ...
随机推荐
- 直接端口打印 支持USB接口的打印机吗?解决办法
直接端口打印 支持USB接口的打印机吗?解决办法 www.MyException.Cn 网友分享于:2013-09-15 浏览:488次 直接端口打印 支持USB接口的打印机吗?问题如 ...
- 分形之科赫(Koch)雪花
科赫曲线是一种分形.其形态似雪花,又称科赫雪花.雪花曲线.瑞典人科赫于1904年提出了著名的“雪花”曲线,这种曲线的作法是,从一个正三角形开始,把每条边分成三等份,然后以各边的中间长度为底边.分别向外 ...
- Elasticsearch 系列1 --- Windows10安装Elasticsearch
在Windows环境下,ES提供了两种安装方式,一种是通过MSI,特点是简单方便:另一种是绿色安装,解压zip包.本文选择第二种方式. 1. 准备工作 (1) Windows 10 (2) JDK 1 ...
- UCore-Lab1
日期:2019/3/31 内容:makefile分析: 一."Makefile"分析 1.1 ucore.img lab1已有的源文件 目录 文件 boot asm.h.boo ...
- XSS 跨站脚本攻击 的防御解决方案
虽然说在某些特殊情况下依然可能会产生XSS,但是如果严格按照此解决方案则能避免大部分XSS攻击. 原则:宁死也不让数据变成可执行的代码,不信任任何用户的数据,严格区数据和代码. XSS的演示 Exam ...
- JavaScript基础(3)-JS中的面向对象、定时器、BOM、位置信息
一.创建对象的几种常用方式. 1.使用Object或对象字面量创建对象: a.使用Object()内置的构造函数来创建对象,例如: var student = new Object(); // 创建一 ...
- cad2020卸载/安装失败/如何彻底卸载清除干净cad2020注册表和文件的方法
cad2020提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装cad2020失败提示cad2020安装未完成,某些产品无法安装,也有时候想重新安装cad2020 ...
- win10安装Ubuntu双系统
1.软碟通做启动盘,不要用easyBCD,比较麻烦 2.windows10中取消选择"启用快速启动(推荐)" 3.压缩出空白卷 4.重启时按F12 5.在bios中将boot pr ...
- Dubbo原理实现之使用Javassist字节码结束构建代理对象
JavassistProxyFactory利用自己吗技术构建代理对象的实现如下: public <T> T getProxy(Invoker<T> invoker, Class ...
- 分布式管理GIT命令总结(转载)
GIT是个了不起但却复杂的源代码管理系统.它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作.让我们诚实一记吧:Git是复杂的,我们不要装作它不是.但我仍然会试图教会你用(我的)基本 ...