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的消息路由 对于路由的 ...
随机推荐
- javascript高级程序设计---第二、三章
在HTML中引用javaScript javascript的几个属性 type async(异步加载 只适用于外部JS且IE8以上 HTML5规范 先于load执行) src defer(延迟加载 ...
- asp.net调用客户端WebBrowser 进行网站地址截屏
在asp.net网站中,如果要实现,在文本框中输入一个URL地址,就把该网页的页面整屏截下来,这段时间一直在研究这一块,在网上查了好多资料.自己又整合了一下. 其实也不是想象中的那么难.主要是通过调用 ...
- css 水平垂直居中总结
空闲总结了下水平垂直居中方案,欢迎补充: 水平居中 水平居中有两种情况: 子元素是内联元素 这种那个情况下只需要在父元素定义: text-align:center; 例子: html: //省略了bo ...
- R语言基本操作函数---变量的基本操作
1.变量变换 as.array(x),as.data.frame(x),as.numeric(x),as.logical(x),as.complex(x),as.character(x) ...
- iOS 10 UserNotifications 使用说明
本教程以贴代码为主.尽可能直观,少量说明. 注意:XCode8的需要手动开启主target Capabilities中的Push Notification. 关于创建多个target后真机测试的证书问 ...
- JAVA微信支付多次回调方法解决方案
@WebServlet("/ActionServlet")public class PayWxOrderingReqCBS extends HttpServlet { public ...
- UVA 10795 新汉诺塔问题
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- push_back模式工作
自己决心今天做一个 xxx项目,写完xxx功能. 早晨9点多张三说:“A项目有一个 bug要修复”,估计十分钟就修复了,然后放弃手头项目去搞.修复这个bug的时候,发现这个A项目有些代码还有可以优化的 ...
- [POJ2069]Super Star(模拟退火)
题目链接:http://poj.org/problem?id=2069 题意:求一个半径最小的球,使得它可以包围住所有点. 模拟退火,圆心每次都去找最远那个点,这样两点之间的距离就是半径,那么接下来移 ...
- Linux进程管理
一.进程管理简介 进程是正在执行的程序或命令,每一个进程都是一个运行实体,都有自己的地址空间,并占用一定的系统资源. 进程管理的作用: 1.判断服务器的健康状态 2.查看系统中的所有进程 3.杀死进程 ...