WCF服务端开发和客户端引用小结
1.服务端开发
1.1 WCF服务创建方式
创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现。通常根据服务宿主的不同,有两种创建方式。
(1)创建WCF应用程序
通过创建WCF服务应用程序,可生成一个带.svc后缀名的文件。该文件与webform中的aspx文件类似,有后置代码,这些后置代码是服务接口的实现。这种方式创建的WCF服务都承载在IIS或WAS上。
(2)创建WCF服务库
WCF服务库是一个类库,如前所述包含一个服务接口和服务实现,此种方式创建的WCF服务可根据需要寄宿在windows客户端、windows服务、控制台程序等宿主上。
1.2 WCF服务的协议
协定定义了服务端可以提供的功能和客户端可以使用的功能,它独立于服务实现代码,可分为如下5种协定类型。
(1)数据协定
主要用于定义在服务端和客户端之间传输的复杂数据类型。对复杂数据类型定义数据协定,主要适用于客户端与服务端共享协定程序集的情况,而如果客户端是添加引用的方式来创建服务代理,则未必要专门定义数据协定。数据协定的类用[DataContract]特性标记,其内部要序列化的属性必须用[DataMember]特性标记。
注:webservice采用XML序列化,此种序列化只序列化公共字段和属性,因此如对复杂数据类型不特别定义数据协定,则会采用这种序列化方式。
(2)服务协定和操作协定
服务协定和操作协定是最重要的两个协定,创建一个WCF服务肯定有这两个协定。
服务协定用于定义描述了服务的WSDL,它通常为一个接口(也可以为一个类),用[ServiceContract]特性标明。操作协定在服务协定里面,定义了服务的操作,并用[OperationContract]特性标明。
ServiceContract和OperationContract有几个比较重要的属性,如下
| 协 定 | 属 性 | 描 述 |
| ServiceContract | SessionMode | 定义该服务协定是否允许有会话,其值用SessionMode枚举定义,包括Allowed、NotAllowed、Required。 |
| OperationContract | IsOneWay | 是否单向操作,单向操作时,客户端不会等待服务端的回应,一般可用于无返回值的操作。 |
| IsInitiating | 当前操作是否启动一个新会话。 | |
| IsTerminating | 当前操作是否关闭会话。 |
(3)消息协定
可以指定传输的数据哪些是放在soap的标题中,哪些是在正文中。消息协定的数据类用[MessageContract]标明,类中放在soap标题和正文中的成员用[MessageHeader]和[MessageBodyMember]标明。
(4)错误协定
默认情况下,为了安全性,在服务端出现的错误不返回客户端,但也可以把包含有用信息的错误返回给调用者。若要将错误返回客户端,可在webConfig中将serviceDebug小节的includeExceptionDetailInFaults属性设为true。强类型化的soap错误协定可以用数据协定定义,并在相应操作协定中用[FaultContract]特性标明,并在该特性的属性中标明错误的类型。

1.3 WCF服务宿主
WCF的服务宿主比较丰富,可以是WAS(Windows Activation Service,Windows激活服务)、IIS、Windows应用程序、Windows服务、控制台应用程序等。
在创建WCF服务时,若创建的是WCF应用程序,则其服务后缀名带.svc,其宿主为IIS或WAS。若创建的是WCF服务库,则其通过实例化ServiceHost,并调用其对象的open()方法,可以寄宿在任意宿主上,且其相关绑定、端点等配置可以用写代码实现(给ServiceHost对象属性赋值),而不必在webConfig中进行配置()。
1.4 WCF服务的服务端配置文件
WCF服务端和客户端的配置都可以在其应用程序配置文件的“system.serviceModel”小节。该小节下的配置项主要由bindings、behaviors和services,其中bindings和behaviors是为services小节服务的。
(1)bindings
bindings小节用来定义绑定,所定义的绑定可添加到service的endpoint小节的bindingConfiguration属性中。当然,该节也可以直接去掉,因为.net预定义了一些绑定,所以endpoint小节中直接使用这些预定义的绑定就可以了。

(2)behaviors
behaviors小节可定义客户端是否允许通过添加引用获取元数据,服务端报错时,客户端是否也允许看到报错等。

(3)services
services小节定义了所提供的服务,其下可以有多个service,每个service下主要有两个子节点:host和endpoint。host可定义服务的基地址,且如果服务要支持多种传输协议的话,也可以有多个基地址。服务端点需要配置服务的相对地址、绑定和服务协定(如果定义了特殊的绑定和行为,则还需将这些特殊的绑定和行为加进来)。而如果服务是自宿主的话,还需另加一个mex端点,用来客户端获取元数据。

*Wcf的配置,除了手动在应用程序的配置文件里配置外,VS还专门提供了一个可视化工具(WCF服务配置编辑器,在工具菜单下)来进行配置。
2.客户端开发
2.1 客户端引用
客户端通过生成WCF服务的代理,来调用服务所提供的一些方法。客户端生成代理的方式有两种:
(1)通过获取wsdl生成代理类:客户端通过vs添加引用,去访问服务端的WSDL文档,并生成一个代理类。
(2)通过共享协定程序集生成代理:客户端引用服务协定的程序集,通过使用ChanelFactory<TChanel>类写代码来生成服务代理,从而调用服务的方法。ChanelFactory<TChanel>类的构造函数需要传绑定信息和端点地址来进行实例化并创建信道,服务用完后,其对象还要调用close()方法关闭信道。

2.2 客户端配置
客户端需配置一个与服务端保持一致的端点(在client小节下),端点中需配置的属性包括服务地址、服务绑定、服务协定等。
WCF服务端开发和客户端引用小结的更多相关文章
- C# WCF服务端搭建和客户端调用
1) 打开Visual Studio 2012,在菜单上点击文件->新建->项目->WCF服务应用程序.在弹出界面的"名称"对应的文本框中输入"WcfS ...
- WCF服务接口多,客户端在引用时出错!报WCF The maximum nametable character count quota (16384) has been exceeded while reading XML data错误
WCF服务接口多,客户端在引用时出错!报WCF The maximum nametable character count quota (16384) has been exceeded while ...
- Delphi XE5通过WebService开发Web服务端和手机客户端
Delphi XE5通过WebService开发Web服务端和手机客户端介绍 我们开发一个三层的android程序 建立一个webservices stand-alone vcl applicati ...
- python网络编程TCP服务多客户端的服务端开发
#服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...
- 网络编程之TCP客户端开发和TCP服务端开发
开发 TCP 客户端程序开发步骤 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 import socket if __name__ == '__main__': ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- [发布]SuperIO v2.2.5 集成OPC服务端和OPC客户端
SuperIO 下载:本站下载 百度网盘 1.修复串口号大于等于10的时候导致IO未知状态. 2.优化RunIODevice(io)函数内部处理流程,二次开发可以重载这个接口. 3.优化IO接收数据, ...
- 在线教学、视频会议 Webus Fox(2) 服务端开发手册
上次在<在线教学.视频会议软件 Webus Fox(1)文本.语音.视频聊天及电子白板基本用法>里介绍了软件的基本用法.本文主要介绍服务器端如何配置.开发. 1. 配置 1.1 IIS配置 ...
- “快的打车”创始人陈伟星的新项目招人啦,高薪急招Java服务端/Android/Ios 客户端研发工程师/ mysql DBA/ app市场推广专家,欢迎大家加入我们的团队! - V2EX
"快的打车"创始人陈伟星的新项目招人啦,高薪急招Java服务端/Android/Ios 客户端研发工程师/ mysql DBA/ app市场推广专家,欢迎大家加入我们的团队! - ...
随机推荐
- vi/vim编辑器的使用
命令模式下操作替换字符:%s/str1/str2/g删除全部内容:%d不保存退出:q!保存退出:wq! 执行shell命令:!command 如!ls -l 在下一行插入shell命令执行 ...
- 21天打造分布式爬虫-Selenium爬取拉钩职位信息(六)
6.1.爬取第一页的职位信息 第一页职位信息 from selenium import webdriver from lxml import etree import re import time c ...
- ES6中的proxy
1 概述 Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写. Proxy 这个词的原意是代理,用在这 ...
- python字符串操作简单方法
1.join #将字符中的每一个元素按照指定分隔符进行拼接 test='你说话带空格' print(test) t=' ' x='_' print(t.join(test)) print(x.join ...
- kafka+elk
安装elasticsearch 下载:http://www.elastic.co/downloads/elasticsearch 下载后解压 修改配置文件,xxx是自定义目录 vi elasticse ...
- Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析
前言 前些天,测试MM发现了一个比较奇怪的bug. 具体表现是: 1.将app包通过电脑QQ传送到手机QQ上面,点击安装,安装后选择打开app (此间的应用逻辑应该是要触发 [闪屏页Activity] ...
- docker 安全
由于容器运行在主机上,且与主机共用一套内核,因此在容器的安全使用上会涉及到容器本身以及主机的安全加固,如针对系统调用,系统资源,远程访问等都需要进行安全方面的考量. docker官网给出了简单的一些建 ...
- Spring Boot + Spring Cloud 构建微服务系统(十):配置中心(Spring Cloud Bus)
技术背景 我们在上一篇讲到,Spring Boot程序只在启动的时候加载配置文件信息,这样在GIT仓库配置修改之后,虽然配置中心服务器能够读取最新的提交信息,但是配置中心客户端却不会重新读取,以至于不 ...
- OS开发(2):自定义tabbar | 导航条 | 突显中间按钮
tabbar是放在APP底部的控件,也叫navigationbar或导航条.常见的APP都使用tabbar来进行功能分类的管理,比如微信.QQ等等. 需求是这样的,需要一个特殊一点的tabbar,要求 ...
- vue-05-webpack安装-vue单文件启动
1, webpack是什么 1), 是一个打包工具, 比gulp, grunt更先进 2), 额外功能 项目部署上线, 清空目录等 hot module reload, 页面刷新后, 数据不变化 3) ...