[WCF编程]1.WCF入门示例
一、WCF是什么?
Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有Http和Ftp的相关技术,是Windows平台上开发分布式应用最佳的实践方式。使用该框架,开发人员可以构建跨平台、安全、可靠和支持事务处理的企业级互联应用解决方案。
二、WCF的优势
1.统一性
WCF涵盖了之前微软推出的所有用于分布式开发的技术,包括Remoting、Web Services、WSE、MSMQ等,并以一种统一的编程模式来实现。
2.互操作性
WCF最基本的通信机制是SOAP(Simple Object Access Protocol 简易对象访问协议),这就保证了系统之间的互操作性,也能够实现.NET客户端与.NET服务端的通信,提供了分布式事务的支持。
3.安全性和可靠性
WCF在安全性上,它完全遵循了WS-*的标准,在SOAP 的header中增加了WS-ReliableMessaging允许可信赖的端对端通信。而建立在WS-Coordination和WS- AtomicTransaction之上的基于SOAP格式交换的信息,则支持两阶段的事务提交(two-phase commit transactions)。
4.兼容性
WCF充分的考虑到了与旧有系统的兼容性。安装WCF并不会影响原有的技术如ASMX和.Net Remoting。即使对于WCF和ASMX而言,虽然两者都使用了SOAP,但基于WCF开发的应用程序,仍然可以直接与ASMX进行交互。
特性 |
Web Service |
.NET Remoting |
Enterprise Services |
WSE |
MSMQ |
WCF |
具有互操作性的Web服务 |
支持 |
支持 |
||||
.NET到.NET的通信 |
支持 |
支持 |
||||
分布式事务 |
支持 |
支持 |
||||
支持WS标准 |
支持 |
支持 |
||||
消息队列 |
支持 |
支持 |
三、WCF简单示例
1.建立解决方案
WCF.Host需引用WCF.Service,WCF.HostByWeb引用WCF.Service
2.WCF.Service项目:
IHelloWorldService.cs文件:
[ServiceContract(Namespace="www.cnblogs.com")]public interface IHelloWorldService{[OperationContract]string SayHello(string str);[OperationContract]Student Say();}[DataContract]public class Student{[DataMember]public string UserName { get; set; }[DataMember]public int Age { get; set; }[DataMember]public GenderMode Gender { get; set; }}public enum GenderMode{Man = 1,Woman = 2,UnKnown = 3}
HelloWorldService.cs
public class HelloWorldService : IHelloWorldService{public string SayHello(string str){return "您说了:" + str;}public Student Say(){Student stu = new Student(){UserName = "zxj",Age = 20,Gender = GenderMode.Man};return stu;}}
3.WCF.Host(以控制台程序作为宿主)
1.以配置文件的方式配置终结点
Program.cs文件
class Program{static void Main(string[] args){ServiceHost host = new ServiceHost(typeof(WCF.Service.HelloWorldService));Console.ForegroundColor = ConsoleColor.DarkYellow;host.Open();Console.WriteLine("服务启动成功......");int i = 0;foreach (ServiceEndpoint endpoint in host.Description.Endpoints){i++;Console.WriteLine("终结点序号:{0},终结点名称:{1},终结点地址:{2},终结点绑定:{3}{4}",i, endpoint.Name, endpoint.Address, endpoint.Binding,Environment.NewLine);}Console.Read();}}
App.config文件
<?xml version="1.0" encoding="utf-8" ?> <configuration><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup><system.serviceModel><services><service name="WCF.Service.HelloWorldService"><endpoint address="http://localhost:8000/HelloWorldService" contract="WCF.Service.IHelloWorldService" binding="wsHttpBinding"></endpoint><endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint><host><baseAddresses><add baseAddress="http://localhost:8000"/></baseAddresses></host></service></services><behaviors><serviceBehaviors><behavior><!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false --><serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/><!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 --><serviceDebug includeExceptionDetailInFaults="false"/></behavior></serviceBehaviors></behaviors></system.serviceModel> </configuration>
2.以编程方式配置终结点
class Program{static void Main(string[] args){//编程方式配置终结点Uri baseAddress = new Uri("http://localhost:8000");ServiceHost host = new ServiceHost(typeof(WCF.Service.HelloWorldService), baseAddress);WSHttpBinding binding = new WSHttpBinding();//寻找元数据ServiceMetadataBehavior metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();//获取宿主的行为列表if (metadataBehavior == null)//如果没有服务原数据交换的行为,实例化添加服务原数据交换行为 {metadataBehavior = new ServiceMetadataBehavior();metadataBehavior.HttpGetEnabled = true;host.Description.Behaviors.Add(metadataBehavior);}host.AddServiceEndpoint(typeof(WCF.Service.IHelloWorldService), binding, "HelloWorldService");host.AddServiceEndpoint(typeof(IMetadataExchange), binding , "mex");Console.ForegroundColor = ConsoleColor.DarkYellow;host.Open();Console.WriteLine("服务启动成功......");int i = 0;foreach (ServiceEndpoint endpoint in host.Description.Endpoints){i++;Console.WriteLine("终结点序号:{0},终结点名称:{1},终结点地址:{2},终结点绑定:{3}{4}", i, endpoint.Name, endpoint.Address, endpoint.Binding, Environment.NewLine);}Console.Read();}}
4.WCF.Client(客户端,控制台程序),需要添加System.Runtime.Serialization和System.ServiceModel引用
这里使用svcutil.exe,生成服务端代理类,使用方法如下:
Visual Studio ——>菜单栏——>工具——>外部工具
启动宿主程序,最好使用右键——以管理员的身份打开控制台宿主程序
宿主程序启动后,打开svcutil.exe程序,
Visual Studio ——>菜单栏——>工具——>SvcUtil(这是前一步配置外部工具时svcutil.exe的标题)
打开之后如图所示,填入宿主元数据地址:
点击确定,
如果你在配置外部工具时,选择和我一样的配置,你可以在解决方案根目录下找到HelloWorldService.cs和output配置文件,将HelloWorldService.cs直接复制到WCF.Client项目中,打开output配置文件,将里面的内容复制到WCF.Client项目中App.config配置文件相应的地方
Program.cs
class Program{static void Main(string[] args){HelloWorldServiceClient client = new HelloWorldServiceClient();string temp = client.SayHello("你好!");Console.WriteLine(temp);Student stu = client.Say();Console.WriteLine("用户名:" + stu.UserName + ",年龄:" + stu.Age + ",性别:" + stu.Gender);Console.Read();}}
生成解决方案,先运行宿主控制台应用程序,再运行客户端控制台程序,客户端控制台程序结果如下图所示:
至此,基于控制台应用程序的宿主相关示例已经结束。下面介绍,基于Web应用程序的宿主相关示例:
5.WCF.HostByWeb(宿主,Web程序)
新建“WCF 服务应用程序”,如图所示:
添加对WCF.Service项目的引用,删除IService1.cs,IService1.svc,新建WebHelloWorldService.svc页面
删除IWebHelloWorldService.cs和WebHelloWorldService.svc.cs文件,如图:
打开WebHelloWorldService.svc:
<%@ ServiceHost Language="C#" Debug="true" Service="WcfService2.WebHelloWorldService" CodeBehind="WebHelloWorldService.svc.cs" %>
修改为:
<%@ ServiceHost Language="C#" Debug="true" Service="WCF.Service.HelloWorldService" %>
主要是Service="WCF.Service.HelloWorldService"。
右键WebHelloWorldService.svc,在浏览器中浏览:
这时我得到的网址为:http://localhost:32797/WebHelloWorldService.svc。
6.WCF.ClientByWeb项目(客户端,控制台程序),需要添加System.Runtime.Serialization和System.ServiceModel引用
在这里与第4步一样,也是使用svcutil.exe工具,根据URL地址生成对应的数据,可以直接参考第4步。
注意:本示例代码,仅供参考不能用于实际开发。
源文件下载:WCF入门示例.rar
转载于:https://www.cnblogs.com/zxj159/p/3922280.html
[WCF编程]1.WCF入门示例相关推荐
- Hadoop大数据--Mapreduce编程规范及入门示例
Mapreduce是一个分布式的运算编程框架,核心功能是将用户编写的核心逻辑代码分布式地运行在一个集群的很多服务器上. Mapreduce的存在价值 (1)海量数据在单机上处理因为硬件资源限制,无法胜 ...
- WCF编程系列(五)元数据
WCF编程系列(五)元数据 示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServiceC ...
- 3月24日下午专家聊天室:轻松掌握WCF 帮你找到入门砖
各位网友,大家注意了,WCF聊天活动将要在下周一在51CTO举行,感兴趣的网友请积极关注和参与,奖品丰厚,10本精彩iT专业图书等你拿!获奖率很高哦! 聊天室入口>>> 获奖 ...
- WCF编程系列(六)以编程方式配置终结点
WCF编程系列(六)以编程方式配置终结点 示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来完成 ...
- qt5使用触屏 偶尔没响应_Qt5+VS2015编程入门示例及注意事项——打印九九乘法表...
在上篇文章中Qt5+VS2015环境配置,已经详细介绍了Qt5.9与VS2015编程环境的搭建步骤,这次给出一个简单的入门示例,演示在VS2015的IDE中,如何使用Qt5.9界面库编写一个简单的打印 ...
- 面向服务的WCF编程(三)
第九章 WCF和TCP应用编程 课后习题 1.TCP有哪些主要特点? ①一对一通信.一旦通信双方建立了TCP连接,连接中的任何一方都能向对方发送数据和接收对方发送来的数据.每个TCP连接只能有两个端点 ...
- kettle 笛卡尔_Kettle-Spoon入门示例
Spoon 是Kettle的设计调试工具 1. 微软ETL与Java 开源Kettle做下对比 微软Integration Services 项目 测试(仅2008版做比较,更高版 ...
- 运动控制器编程_快速入门 | 篇二十一:运动控制器ZHMI组态编程简介一
点击上方"正运动小助手",随时关注新动态! 运动控制器ZHMI组态编程简介一 今天我们来学习一下,运动控制器的ZHMI组态编程简介.本文主要从产品概述.控制器连接触摸屏使用.HM ...
- python爬虫入门实例-终于领会python爬虫入门示例
随着人工智能 大数据的火热 Python成为了广大科学家和普通大众的学习语言.在学习Python的过程中 有很多人感到迷茫 不知道自己该从什么地方入手,今天我们就来说一些新手该如何学习Python编程 ...
最新文章
- Create a restful app with AngularJS/Grails(4)
- 购买云服务器,为什么要购买云服务器
- php截取剩余部分,PHP从字串中截取一部分,支持使用(*)模糊截取
- 通过xrdp远程访问ubuntu出现输入d最小化问题的处理
- 基于WinSvr2016(TP)构建的“超融合技术架构”进阶篇
- python输入多行字符串_python中怎么输入多行字符串
- qt linux 鼠标事件,QT学习笔记5:QMouseEvent鼠标事件简介
- (12)MSP430F5529 常用内置函数和一些说明
- HH SaaS电商系统移动端商城,买家选择商品规格的交互设计
- c#(.net)对dbf(arcgis shp属性表)的操作 (验证版)
- arailsdemo 1
- 使用verilog实现4选1数据选择器的几种方法
- 清明上河图30亿像素_清明上河图高清下载|
- js 获取ip和浏览器信息
- 打印 条码 CodeSoft JsBarCode
- tkmybatis 子查询_最全的真假童子命查询方法!不想被忽悠就看看
- ios开发中如何调用苹果自带地图导航
- VMOS-Pro一款虚拟机app。
- Bypass disable_function【CTFHUB】
- 巾帼不让须眉 IT界10大女性CEO排行