WCF学习总结
1. WCF简介
WCF (Windows Communication Foundation)是由微软发展的一组数据通信的应用程序开发借口。WCF由服务地址(Address) 、协议绑定 (Binding)和 契约(Contract)三部分组成,既“ABC”。
2. 为什么用WCF
WCF既支持具有互操作性的Web服务,也能够实现.NET客户端与.NET服务端的通信,提供了分布式事务的支持,同时在安全性上,它完全遵循了WS-*的标准,此外,它还支持队列服务,可以非常方便地利用消息队列完成异步操作与脱机调用。
特性 |
Web Service |
.NET Remoting |
Enterprise Services |
WSE |
MSMQ |
WCF |
具有互操作性的Web服务 |
支持 |
支持 |
||||
.NET到.NET的通信 |
支持 |
支持 |
||||
分布式事务 |
支持 |
支持 |
||||
支持WS标准 |
支持 |
支持 |
||||
消息队列 |
支持 |
支持 |
WCF引入了用通道,它封装了消息的通信细节,例如编码、事务处理、安全等,然后又通过引入绑定的概念,封装了通道的组成顺序与处理细节。最后,引入了独有的Endpoint元素,集成了地址、绑定和契约之间的“三位一体”,以最简单的方式定义和发布服务。
3. Web Service 的两种使用方式:
1. 直接在VS 环境中创建WebService服务
在创建的项目下,会生成一个IService.cs借口文件和Service.svc服务文件,在IService.cs文件中可以加入自己需要的方法签名。然后Service.svc服务文件实现了IService借口中的方法,之后你运行此项目,将会生成一个URL地址既服务地址:如http://localhost:47948/Service1.svc,复制这个地址,然后创建一个客户端应用程序,如windows forms或者控制台应用程序都行,创建好之后在Reference上右击添加Web服务,将此地址粘贴。然后再客户端的代码中写如下代码调用Server端的方法:
ServiceClient sc=new ServiceClient();
sc.GetData();
sc.Close();
这样就可以实现WCF最简单的使用。
2. 用SVCUtil.exe 编译服务地址
在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 此目录下有SvcUtil.exe 这个编译命令,她会将服务地址编译成一个.cs文件和一个.config配置文件。这样之后将这两个文件拷贝到客户端的项目中,使用上面的调用方法也可以得到相同的作用。
运行cmd命令,输入:CD C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 再输入: SvcUtil.exe http://localhost:47948/Service1.svc -language:C# -out:C:\WebTest\User.cs -config:C:\WebTest\User.config 回车,他就会在C:\WebTest下面生成User.cs和User.config文件。(注:User.config文件拷贝到项目中之后需要重命名为app.config或者 Web.config)。客户端调用代码同上。
4. 自己写code配置服务的两种方法
1. 自己写App.config配置服务信息
代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="WinServiceTest.Test" behaviorConfiguration ="testBehavior">
<host>
<baseAddresses>
<add baseAddress ="http://localhost:8080/test"/>
</baseAddresses>
</host>
<endpoint address ="" binding="basicHttpBinding" contract ="Service.IService" >
</endpoint>
</service>
</services>
<behaviors >
<serviceBehaviors >
<behavior name="testBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
然后在客户端 写如下代码host起服务器:
ServiceHost host = null;
private void button1_Click(object sender, EventArgs e)
{
host = new ServiceHost(typeof(WinServiceTest.Test));
host.Open();
label1.Text = "服务已经启动";
}
注:WinServiceTest.Test 是当前项目中的一个累,继承了Server端的借口类,并实现了他的方法。当这个服务启动起来之后,我们可以检测他到底是不是启动起来了,我们可以用浏览器打开上面写得那个baseAddress中的地址进行确定,如果打开像WebService中的那样,那就证明我们启动起来了,如果出现错误,估计就配对不对。
在启动服务有可能会报这个错误:"HTTP 无法注册 URL http://+:8080/test/。进程不具有此命名空间的访问权限“,处理这个错误的方法是关闭VS,然后用管理员身份运行VS就可以了。
在创建一个客户端去调用服务端的方法有两种,第一种就是用添加Web服务引用的方式将baseAddress中的服务地址添加进去,然后通过ServiceClient去访问。
第二种还是用代码去访问,代码如下:
//地址
EndpointAddress a = new EndpointAddress("http://localhost:8080/test");
//绑定
BasicHttpBinding btb = new BasicHttpBinding();
//通道工厂
ChannelFactory<Service.IService> cf = new ChannelFactory<Service.IService>(btb, a);
Service.IService sis = cf.CreateChannel();
int t = sis.Add(3, 5);
MessageBox.Show(t.ToString());
这样就可以实现自己配置服务器,自己去host服务器,然后调用方法。
2. 用Code 配置服务器 host起服务器
代码如下:
ServiceHost host = null;
private void button1_Click(object sender, EventArgs e)
{
host = new ServiceHost(typeof(WinTest.Test));
NetTcpBinding tcp=new NetTcpBinding ();
string a = "net.tcp://localhost/test";
host.AddServiceEndpoint(typeof(Service.IService), tcp, a);
host.Opened += delegate { label1.Text = "服务已经启动!"; };
host.Open();
}
private void button2_Click(object sender, EventArgs e)
{
if (host.State == CommunicationState.Opened)
host.Close();
label1.Text = "服务已经关闭";
}
然后同上创建一个客户端去调用服务器端的方法:
//地址
EndpointAddress a = new EndpointAddress("net.tcp://localhost:8080/test");
//绑定
NetTcpBinding btb = new NetTcpBinding();
//通道工厂
ChannelFactory<Service.IService> cf = new ChannelFactory<Service.IService>(btb, a);
Service.IService sis = cf.CreateChannel();
int t= sis.Add(3, 5);
MessageBox.Show(t.ToString());
4. 总结
上面是简单的WCF的四种应用,WCF在如今的大多数项目应用很广泛。
除过上面的简单例子,我们还可以用一下网上公布的服务地址如天气预报服务地址,号码归属地查询等一些WebService服务,用法就是将这些服务添加到自己的项目中,然后通过对应的ServiceClient 去调用。
WCF学习总结的更多相关文章
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- WCF学习之旅—第三个示例之二(二十八)
上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1) 使用NuGet下载最新版的Entity Fram ...
- WCF学习之旅—第三个示例之三(二十九)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...
- WCF学习之旅—WCF服务部署到IIS7.5(九)
上接 WCF学习之旅—WCF寄宿前的准备(八) 四.WCF服务部署到IIS7.5 我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以 ...
- WCF学习之旅—WCF服务部署到应用程序(十)
上接 WCF学习之旅—WCF寄宿前的准备(八) WCF学习之旅—WCF服务部署到IIS7.5(九) 五.控制台应用程序宿主 (1) 在解决方案下新建控制台输出项目 ConsoleHosting.如下 ...
- WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...
- WCF学习之旅—WCF服务的WAS寄宿(十二)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...
- WCF学习之旅—WCF服务的批量寄宿(十三)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...
- WCF学习之旅—第三个示例之五(三十一)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) WCF学习 ...
- WCF学习之旅—TcpTrace工具(二十六)
止文(WCF学习之旅—TcpTrace工具(二十五))介绍了关于TcpTrance的一种使用方式,接下来介绍第二种使用方式. 三.通过ListenUri实现基于tcpTracer的消息路由 对于路由的 ...
随机推荐
- asp.net mvc adminlte第一波
首页模板选用官方DEMO中的Blank模板,这个模板相对来说是最干净的. 首页模板的分割: 官方文档是分的4个部分 Wrapper .wrapper. A div that wraps the who ...
- quick-cocos2d-x 实现在lua里面完成android支付宝的接入
quick-cocos2d-x 实现在lua里面完成android支付宝的接入 一.支付宝注册是很麻烦的一个过程,本文就不解释了,想了解的去官网看下注册流程.然后下载他们的sdk-WS_SECURE_ ...
- sql server常用语法点
if exists(select name from sysobjects where name = 'stuInfo')drop table stuInfogocreate table stuInf ...
- redis 使用
Redis 使用 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久 ...
- Network Wars-ZOJ2676最小割+01规划
Time Limit: 5 Seconds Memory Limit: 32768 KB Special Judge Network of Byteland consists of n servers ...
- HDU 5860 Death Sequence(死亡序列)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- div+css常见浏览器兼容问题以及解决办法
1.图片下方出现几像素的空白间隙问题说明:这个问题在ie6和ff(火狐)下经常见到,例如 <div><img src=""/></div>这个图 ...
- 单例模式getInstance()
/** * 对象的实例化方法,也是比较多的,最常用的方法是直接使用new,而这是最普通的,如果要考虑到其它的需要,如单实例模式,层次间调用等等. * 直接使用new就不可以实现好的设计好,这时候需要使 ...
- 个人博客作业week7
个人阅读作业week7 一.瀑布 软件工程的瀑布模型是1970年由Winston Royce提出来的,即软件的开发按照一个严格的.顺序的.单次的瀑布流开发周期.例如需求分析阶段.概要设计阶段.详细设计 ...
- 关于HTML5音频——audio标签和Web Audio API各平台浏览器的支持情况
对比audio标签 和 Web Audio API 各平台浏览器的支持情况: audio element Web Audio API desktop browsers Chrome 14 Yes ...