传说中的WCF(1):这东西难学吗?
WCF难学吗?
是啊,这问题估计很多人都会问,也包括阿拉在内,也有此深刻而严重的凝问。
也有人说:“如何某项技术可以化繁为简,学起来轻松一点就好了。”也许,人类开生就摆脱不了一种习性——懒惰;不过,也有人认为,很多时候,人们是不是总喜欢把简单的事情复杂化,那么,很多人都觉得很复杂的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();
}
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应用程序就完成了。

2013-12-07
传说中的WCF(1):这东西难学吗?的更多相关文章
- 传说中的WCF(2):服务协定的那些事儿
上一篇文章中,我们抛出了N个问题:WCF到底难不难学?复杂吗?如果复杂,可以化繁为简吗? 其实,这些问题的答案全取决于你的心态,都说“态度决定一切”,这句话,不知道各位信不信,反正我是信了.首先,敢于 ...
- [转] 传说中的WCF(2):服务协定的那些事儿
上一篇文章中,我们抛出了N个问题:WCF到底难不难学?复杂吗?如果复杂,可以化繁为简吗? 其实,这些问题的答案全取决于你的心态,都说“态度决定一切”,这句话,不知道各位信不信,反正我是信了.首先,敢于 ...
- 2014年9月21日_随笔,jdic,ETL,groovy,Nutz好多东西想学
(1)老妈十一要回老家,才突然发现买票好难啊.有亲朋很重要 (2)这周我做了什么.jdic,ETL,groovy, Nutz好多东西想学. Nutz开发成员专访.Nutz优酷视频(演讲).Nutz 入 ...
- JVM 真的很难学么?不、只是你“不敢学”而已
JVM 真的很难学么?不.只是你"不敢学"而已 许多招聘的信息上面都说,要了解jvm.多线程什么的对于 java 程序员来说,这是工作好多年的程序员都不一定能掌握的东 ...
- C语言指针专题——指针难学的4点原因
前一篇跟大家聊了聊指针的概念,可是就算了解了指针是什么,为什么依然感觉难学?我试着从几个点切入,聊聊指针难学之处. 文末会给大家推荐几本书,有需要的朋友可以看看! 难点1. 讨厌的星号 定义指针变量p ...
- 传说中的WCF(10):消息拦截与篡改
我们知道,在WCF中,客户端对服务操作方法的每一次调用,都可以被看作是一条消息,而且,可能我们还会有一个疑问:如何知道客户端与服务器通讯过 程中,期间发送和接收的SOAP是什么样子.当然,也有人是通过 ...
- 传说中的WCF:消息拦截与篡改
我们知道,在WCF中,客户端对服务操作方法的每一次调用,都可以被看作是一条消息,而且,可能我们还会有一个疑问:如何知道客户端与服务器通讯过程中,期间发送和接收的SOAP是什么样子.当然,也有人是通过借 ...
- 传说中的WCF(7):“单向”&“双向”
在WCF中,服务器与客户端的通讯有单向(单工)和双向(双工)之分.要说有什么形式上的表现,那就是单向与双向生成的SOAP不同,咱们先放下代码不说.但通常情况下,我们也不太需要去研究生成的SOAP是啥样 ...
- 传说中的WCF(5):数据协定(a)
在第4篇中,咱们了解了发送/接收SOAP头,从本篇开头,我们不妨更深入地去探求一下有关WCF中的消息到底是啥玩意儿.WCF庞大而复杂,而从 MSDN文档中,你会看到许多很专业很抽象的东西,你不禁会问, ...
随机推荐
- UVALive 4730 Kingdom +段树和支票托收
主题链接:点击打开链接 题意见白书P248 思路: 先把读入的y值都扩大2倍变成整数 然后离散化一下 用线段树来维护y轴 区间上每一个点的 城市数量和联通块数量. 然后用并查集维护每一个联通块及联通块 ...
- 数字使用相应的加密策略传递一个字符串后Java实现代码
公司采用公用电话传递数据,数据小于8整数位,为了确保安全, 在转移的过程中需要加密,加密规则如下面的: 第一个数据下降,附图然后各加5,和除以10的余数取代该数字, ...
- ORACLE 动态注册和静态注册的区别(转)
1, oracle 10g 用netca方式建立的都默认为动态注册方式2,如果想改为静态注册的方式则在listener.ora 中加入如下内容即可 SID_LIST_LISTENER = (SID_L ...
- JS通用方法扩展
/* * 系统中JS的扩展函数 * * */ // 清除两边的空格 String.prototype.trim = function() { returnthis.replace(/(^\s*)|(\ ...
- oracle_修改Oracle数据库字符集 AL32UTF8;
修改数据库字符集 以支持维文等 utf8 停掉库 进入装载模式 ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_ ...
- mysql 打开远程服务
进mysqlserver 例如下列: Enter password: ****** Welcome to the MySQL monitor. Commands end with ; or \g. ...
- ThinkPHP 3.2 开放 cache注缓存,过滤非法字符
打开缓存配置文件 /Application/Common/conf/cache.php源代码如下面: <?php return array( //'配置项'=>'配置值' 'LAYOUT_ ...
- 移动小bug
1. 在三星note2,小米2,页面加载后,页面有黑块. 那么提高被盖住的部分z-index. 2. iphone5 ,ios7.0.4,上文字显示不出 那么就先hide,setTimeout几百毫秒 ...
- log4e插件的安装和使用
1.首先下载log4e小工具.放入myeclipse10安装文件夹D:\Program Files (x86)\myEclipse10\MyEclipse Blue Edition 10\dropin ...
- Android分析应用程序的构建过程
为了方便Android应用开发要求我们Androidproject编制和包装有了更深入的了解,例如,我们知道这是做什么的每一步,境和工具.输入和输出是什么.等等. 在前文<命令行下Android ...