[转] 传说中的WCF
这个解决方案中包含两个项目,一个叫Server,另一个叫Client,天生一对。
1、启动VS 2010,推荐用2010以上版本(2012 RC版也行),因为越高版本越好用,最好Express的,不要钱,我天天用。
2、新建两个控制台项目,不用我教你了吧,建完后,你的VS应该和下图所示的差不多。

3、在“解决方案资源管理器”上,找到解决方案节点,在其上右击,从弹出的菜单中选择“属性”。

4、在弹出的窗口,在“启动项目”中选择“当前选定的内容”,如下图所示。

这样做,是为了在启动调试时更方便,你可以不设置。呵呵。
5、选中“Server”项目,不要弄错了,一般来说,我们是先完成服务器端。
在Server项目的“引用”上右击,从快捷菜单中选择“添加引用...”,在随后打开的窗口中,确认选定.NET选项卡,在列表中找到System.ServiceModel,然后,单击确定,这个不用我介绍了。

6、打开Server项目的Program.cs文件,首先,要引入几个可能要用到的命名空间。
- using System.ServiceModel;
- using System.ServiceModel.Description;
7、定义一个服务协定,其中包含一个TestMethod方法,服务协定是一个接口。
- [ServiceContract]
- public interface IService
- {
- [OperationContract]
- string TestMethod();
- }
我们看到,服务协定是一个接口,但附加了ServiceContractAttribute特性,而接口中的方法也附加了OperationContractAttribute特性,作为服务操作,可以供客户端程序调用,如果不加OperationContractAttribute特性,就不向客户端公开该方法。
8、定义一个类,并实现上面定义的服务协定。
- public class MyService : IService
- {
- public string TestMethod()
- {
- return "信春哥,考本科。";
- }
- }
9、在Main入口点中定义服务器相关的参数,并启动服务。
- static void Main(string[] args)
- {
- // 基址URI,必须,HTTP方案
- Uri baseURI = new Uri("http://localhost:8008/Service");
- using (ServiceHost host = new ServiceHost(typeof(MyService),baseURI))
- {
- // 向服务器添终结点
- WSHttpBinding binding = new WSHttpBinding();
- // 这里不需要安全验证
- binding.Security.Mode = SecurityMode.None;
- host.AddServiceEndpoint(typeof(IService), binding, "my");
- // 为了能让VS生成客户端代码,即WSDL文档,故要添加以下行为
- ServiceMetadataBehavior mdBehavior = new ServiceMetadataBehavior()
- {
- HttpGetEnabled = true
- };
- host.Description.Behaviors.Add(mdBehavior);
- //如果服务顺利启动,则提示,处理Opened事件
- host.Opened += (sender, e) => Console.WriteLine("服务已启动。");
- // 启动服务器
- try
- {
- host.Open();
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- // 为了让程序不往下执行而结束,故加上这句
- Console.ReadKey();
- // 关闭服务器
- host.Close();
- }
- }
这时候,先确认Server项目是当前选定项目,然后运行,如果成功,你会看到如下图所示的内容。

好了,服务器端我们就完成了,下面轮到客户端。
这个就简单了,先找到Server所在的 \bin\debug 目录,运行Server.exe,确保服务成功启动。
选定Client项目,在“引用”上右击,从快捷菜单中选择“添加服务引用”

在弹出的窗口中输入刚才定义的基址,即http://localhost:8008/Service,记住,一定要用基址,就是创建ServiceHost实例时用的那个,不要用终结点地址。
单击“前往”按钮,服务读取正确后,输入你要的命名空间名字,单击确定。

这时候,我们就可以在客户端写代码了,
- static void Main(string[] args)
- {
- WS.ServiceClient client = new WS.ServiceClient();
- Console.WriteLine(client.TestMethod());
- Console.ReadKey();
- }
运行一下,我们的第一个WCF应用程序就完成了。

[转] 传说中的WCF的更多相关文章
- 传说中的WCF(12):服务器回调有啥用
你说,服务器端回调有啥用呢?这样问,估计不好回答,是吧.不急,先讨论一个情景. 假设现有服务器端S,客户端A开始连接S并调用相关操作,其中有一个操作,在功能上有些特殊,调用后无法即时回复,因为在服务器 ...
- 传说中的WCF(11):会话(Session)
在标题中我加了一个大家都很熟悉的单词——Session,熟吧?玩过Web开发的朋友肯定在梦中都会见到她. 在Web中为什么要会话呢?毕竟每个用户在一个Web应用中可能不止进行一次操作,比如,某二手飞机 ...
- 传说中的WCF(10):消息拦截与篡改
我们知道,在WCF中,客户端对服务操作方法的每一次调用,都可以被看作是一条消息,而且,可能我们还会有一个疑问:如何知道客户端与服务器通讯过 程中,期间发送和接收的SOAP是什么样子.当然,也有人是通过 ...
- 传说中的WCF(9):流与文件传输
在使用Socket/TCP来传输文件,弄起来不仅会有些复杂,而且较经典的“粘包”问题有时候会让人火冒七丈.如果你不喜欢用Socket来传文件,不妨试试WCF,WCF的流模式传输还是相当强大和相当实用的 ...
- 传说中的WCF(8):玩转消息协定
Message翻译成中文,相信各位不陌生,是啊,就是消息,在WCF中也有消息这玩意儿,不知道你怎么去理解它.反正俺的理解,就像我们互发短信一个道理,通讯的双方就是服务器与客户端,说白了吧,就是二者之间 ...
- 传说中的WCF(7):“单向”&“双向”
在WCF中,服务器与客户端的通讯有单向(单工)和双向(双工)之分.要说有什么形式上的表现,那就是单向与双向生成的SOAP不同,咱们先放下代码不说.但通常情况下,我们也不太需要去研究生成的SOAP是啥样 ...
- 传说中的WCF(5):数据协定(a)
在第4篇中,咱们了解了发送/接收SOAP头,从本篇开头,我们不妨更深入地去探求一下有关WCF中的消息到底是啥玩意儿.WCF庞大而复杂,而从 MSDN文档中,你会看到许多很专业很抽象的东西,你不禁会问, ...
- 传说中的WCF(4):发送和接收SOAP头
如果你实在不明白Header是个啥玩意儿,你就想一想你发送电子邮件时,是不是有个叫“附件”的东东?对啊,那么SOAP头是不是可以理解为一种附加信息?就是附加到消息正文的内容. 消息正文又是啥?WCF除 ...
- 传说中的WCF(3):多个协定
我们知道,WCF服务端是先定义服务协定,其实就是一个接口,然后通过实现接口来定义服务类.那么,有一个问题,如果一个服务类同时实现N个接口(也就是有N个协定)呢?结果会如何? 不必猜,我们还是通过实验来 ...
- 传说中的WCF(2):服务协定的那些事儿
上一篇文章中,我们抛出了N个问题:WCF到底难不难学?复杂吗?如果复杂,可以化繁为简吗? 其实,这些问题的答案全取决于你的心态,都说“态度决定一切”,这句话,不知道各位信不信,反正我是信了.首先,敢于 ...
随机推荐
- MySQL用户管理和权限设置
用户管理 mysql>use mysql; 查看 mysql> select host,user,password from user ; 创建 mysql> create user ...
- postgres导入其他数据库数据
最近对postgres数据库进行深入研究,将原来项目中使用的sqlserver数据库中的数据表导入postgres,网上搜索postgres数据导入,除空间数据库可以通过PostGIS 2.0 Sha ...
- (知识点)JS获取网页高度
网页可见区域的宽:document.body.clientWidth 网页可见区域的高:document.body.clientHeight 网页可见区域的宽:document.body.offset ...
- redis的主从复制
一.主从复制概述 二.主从复制的过程:
- linux vi 报错 E37: No write since last change (add ! to override)
用 vi 命令编辑文本文件,没有文件写入权限的时候会报这个错.:q :wq 怎么都不能退出. 这时只需 ctrl+z 即可,或者在退出命令后加 ! 忽略提示 :q!
- javascript设计模式详解之策略模式
接上篇命令模式来继续看下js设计模式中另一种常用的模式,策略模式.策略模式也是js开发中常用的一种实例,不要被这么略显深邃的名字给迷惑了.接下来我们慢慢看一下. 一.基本概念与使用场景: 基本概念:定 ...
- 使用Java语言开发微信公众平台(七)——音乐消息的回复
在上一节课程中,我们学习了图片消息的回复功能.根据微信公众平台的消息类型显示,微信共支持文本.图片.语音.视频.音乐.图文等6种消息类型的回复: 其中,我们已经实现了文本.图文.图片等消息的回复处理, ...
- VR的发展历程-VR全景智慧城市
从1962年有第一台VR开始,到2014年Oculus被Facebook收购为止,VR经历了一个非常漫长的过程.从鲜为人知,到被广泛认识,逐渐走进我们生活.这就是VR形成的时代.在这个时代里,VR设备 ...
- Mac OS 安装 Git 环境
1. 在mac的终端上,输入git会提示安装git软件,确认安装.安装完成后打开终端,使用git --version或者which git命令查看安装版本,有就是安装成功了. 2. 创建一个全局用户名 ...
- Java 多线程详解(二)------如何创建进程和线程
Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html 在上一篇博客中,我们已经介绍了并发和并行的区别,以及进程和 ...