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的消息路由 对于路由的 ...
随机推荐
- GDB的深入研究
GDB的深入研究 一.GDB代码调试 (一)GDB调试实例 在终端中编译一个示例C语言小程序,保存为文件 gdblianxi.c 中,用GCC编译. 在上面的命令行中,使用-o参数指定了编译生成的可执 ...
- 机器人操作臂运动学入门一--D-H参数标定
最近重新学习机器人方面的知识,想到一年以前在学校选修<机器人学技术基础>这门课的时候,老师虽然讲机器人的各个方面的知识都讲到了,但只是浮光绿影的的提到,并没有真正讲到深处,我的理解也没有更 ...
- LLVM与Clang的概述及关系
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time).链接时间(link-time).运行时间(run-time ...
- 我的Android第四章
本章需掌握 1.连接真机的过程. 2.dx指令的作用 3.adb是什么? 4.adb有什么用(有什么好处)? 5.adb的一些常用命令 1.连接真机的过程. 需要:一部Android机.usb连接线, ...
- (转)深入浅出 妙用Javascript中apply、call、bind
原文连接 深入浅出 妙用Javascript中apply.call.bind 网上文章虽多,大多复制粘贴,且晦涩难懂,我希望能够通过这篇文章,能够清晰的提升对apply.call.bind的认识,并且 ...
- 【前端】event.target 和 event.currentTarget 的区别
event.target 和 event.currentTarget 的区别 举例说明: <!DOCTYPE html> <html> <head> <tit ...
- json提交
function publishPost(postId){ var _csrf = jQuery('*[name="_csrf"]').val(); jQuery.ajax({ t ...
- sql存储过程比sql语句执行慢很多
参数嗅探的问题 原因:(1)可能是发生了参数嗅探,第一次赋给存储过程的输入参数,会为该存储过程生成一个基于输入参数的执行计划,因此如果第一次输入的参数不具有代表性(例如大部分查询输入的参数都是A值,但 ...
- Navicat for mysql 远程连接 mySql数据库10061、1045错误
原文地址:http://www.111cn.net/database/mysql/46377.htm 有朋友可能会碰到使用Navicat for mysql 远程连接 mySql数据库会提示10061 ...
- Java 动态生成复杂 Word
Java 动态生成复杂 Word 阅读目录 1. 制作 Word 模版,将你需要动态生成的字段用${}替换.2. 将 Word文档保存为 xml .3. 引入项目. 项目中需要用 java 程序生成d ...