WCF的三个名称/命名空间,你是否傻傻分不清楚?
在定义和寄宿WCF服务的时候会面临三个名称/命名空间,它们分别是ServiceContractAttribute、ServiceBehaviorAttribute和Binding的Name和Namespace属性,很对人对此不能很好地区分。
一、ServiceContractAttribute的名称/命名空间
每个服务契约都有一个确定的名称,当在一个接口或类上应用了ServiceContractAttribute特性,默认的名称就是接口或类的名称。我们可以通过Name属性显式地指定需要的名称,这在某些场景中往往具有重要的作用。比如在客户端有一个通过接口的形式定义的服务契约,现有的很多客户端代码均依赖于这个接口,如果这个时候服务方的名称改变了,客户端仅须更新这个Name属性,从而避免修改接口的名称而造成对现有代码的影响。
1: public sealed class ServiceContractAttribute : Attribute
2: {
3: //其他成员
4: public string Name { get; set; }
5: public string Namespace { get; set; }
6: }
至于服务契约的命名空间,其作用和我们托管语言(比如C#、VB.NET)的命名空间完全一样,旨在解决命名冲突问题。很多WCF的编程人员都不太注重在定义服务契约的时候指定命名空间,这是一个不太好的习惯。我们鼓励采用包含你所在的公司名称或项目名称作为命名空间。WCF默认采用的命名空间是http://tempuri.org/。
作为服务的描述信息,服务契约作为WSDL的一部分以元数据的形式发布出来。WSDL通过<portType>元素定义相应的服务契约。ServiceContractAttribute的Name和Namespace属性对应着用于描述服务契约的<portType>元素的名称和命名空间。
1: [ServiceContract(Name = "CaclService", Namespace = "http://www.artech.com/")]
2: public interface ICalculator
3: {
4: //省略成员
5: }
如上面的代码所示,我们应用了ServiceContractAttribute特性将接口ICalculator接口定义成服务契约。ServiceContractAttribute的Name和Namespace分别被设置成CaclService和http://www.artech.com/"。服务契约将会对应着如下一段WSDL。
1: <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
2: xmlns: tns = "http://www.artech.com/"...>
3: <wsdl:portType name="tns:CaclService">
4: ...
5: </wsdl:portType>
6: </wsdl:definitions>
二、ServiceBehaviorAttribute的名称和命名空间
关于通过ServiceContractAttribute特性定义的服务契约的名称和命名空间,很多人会和通过ServiceBehaviorAttribute定义的名称和命名空间混淆。
1: [AttributeUsage(AttributeTargets.Class)]
2: public sealed class ServiceBehaviorAttribute : Attribute, IServiceBehavior
3: {
4: //其他成员
5: public string Name { get; set; }
6: public string Namespace { get; set; }
7: }
实际上服务行为特性ServiceBehaviorAttribute定义的是服务本身的名称和命名控件。这两个属性将作为整个WSDL根节点< definitions >的name和targetNamespace属性。如果没有对其进行显式设置,默认的命名空间为http://tempuri.org/。WCF将使用服务类型的名称作为作为服务名称。
1: [ServiceBehavior(Name = "CaclService",
2: Namespace ="http://www.artech.com")]
3: public class CalculatorService : ICalculator
4: {
5: //省略成员
6: }
对于上面定义的服务类型来说,由于我们通过ServiceBehaviorAttribute特性对名称和命名空间进行了显式设置。用于描述服务的WSDL将具有如下一个根节点。
1: <wsdl:definitions name="CaclService"
2: targetNamespace="http://www.artech.com"
3: xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" ...>
4: </wsdl:definitions>
三、Binding的名称和命名空间
既然已经将到了服务契约和服务的名称和命名空间,我们顺便来谈谈另一组命名和命名空间。其实作为终结点三要素之一的绑定也具有自己的名称和命名空间。如下面的代码所示,作为绑定基类的抽象类Binding同样具有一组Name和Namespace属性。
1: public abstract class Binding
2: {
3: //省略成员
4: public string Name { get; set; }
5: public string Namespace { get; set; }
6: }
Binding的名称和命名空间通过服务终结点的bindingName和bindingNamespace属性进行设置。由于这两个属性属于服务描述范畴,所以客户端终结点无此设置。由于绑定在WSDL中对应的节点为<binding>,所以绑定的Name和Namespace属性值将作为对应的<binding>节点的名称和命名空间。在默认的情况下,<binding>元素的命名空间的值依然是http://tempuri.org/。至于名称,则通过绑定类型名称和契约名称合并而成。比如说契约名称为ICalculator,并采用BasicHttpBinding,那么对应的<binding>元数的名称为BasicHttpBinding_ICalculator。
1: <configuration>
2: <system.serviceModel>
3: <services>
4: <service ...>
5: <endpoint bindingName="myBasicHttpBinding"
6: bindingNamespace="http://www.artech.com" .../>
7: </service>
8: </services>
9: </system.serviceModel>
10: </configuration>
比如说在服务寄宿时采用如上的配置将终结点的绑定名称和命名空间进行了显式设置,并且采用如上的服务契约(名称被定义成CalcService)。该终结点绑定在WSDL中将对应于如下一个<binding>元素。
1: <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
2: xmlns:tns = "http://www.artech.com/">
3: <wsdl:binding name="tns: myBasicHttpBinding_CalcService" ...>
4: </wsdl:binding>
5: </wsdl:definitions>
WCF的三个名称/命名空间,你是否傻傻分不清楚?的更多相关文章
- [老老实实学WCF] 第三篇 在IIS中寄存服务
老老实实学WCF 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包括定义和实现服务协定.配置服务.寄宿服务.通过添加服务引用的方式配置客户端并访问服务.我 ...
- 替换 wcf 消息传输中的 命名空间
替换 wcf 消息传输中的 命名空间,http://vanacosmin.ro/Articles/Read/WCFEnvelopeNamespacePrefix
- (转) [老老实实学WCF] 第三篇 在IIS中寄存服务
第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包括定义和实现服务协定.配置服务.寄宿服务.通过添加服务引用的方式配置客户端并访问服务.我们对WCF的编程生 ...
- WCF服务三:svc文件详解
在前面的文章中讲述过WCF服务的宿主程序主要包括:三种,在那篇文章中,简单的描述了如何把一个WCF服务寄宿到IIS上面,这篇文章中将具体讲述如何把一个WCF服务寄宿到IIS上面. 一.新建一个WCF服 ...
- WCF(三)IIS寄宿
WCF常用的一种使用方式是寄宿在IIS中. IIS寄宿操作流程如下: 1.创建IIS物理路径对应的文件夹,文件夹名称是WCFIIS. 2.在WCFIIS文件夹中添加文本文件,在文本文件中写入<% ...
- 十五天精通WCF——第三天 client如何知道server提供的功能清单
通常我们去大保健的时候,都会找姑娘问一下这里能提供什么服务,什么价格,这时候可能姑娘会跟你口述一些服务或者提供一份服务清单,这样的话大 家就可以做到童嫂无欺,这样一份活生生的例子,在wcf中同样是一 ...
- 浅谈WCF的三种通信模式:请求响应模式、数据报模式和双工通讯模式
一: WCF的服务端与客户端在通信时有三种模式:请求响应模式.数据报模式和双工通讯模式. 说一下基本知识, 1.如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契 ...
- WCF(三)分布式事务
最近在学WCF,所以有两个设想疑问(菜鸟多疑问): 如果有WCF服务A,WCF服务B,客户端调用WCF服务A插入一条数据,然后再调用服务B也插入一条数据,然而服务B出错了进行了回滚,服务A能不能也进行 ...
- 我们一起学习WCF 第三篇头消息验证用户身份
前言:今天我主要写的是关于头消息的一个用处验证用户信息 下面我画一个图,可以先看图 第一步:我们先开始做用户请求代码 首先:创建一个可执行的上下文对象块并定义内部传输的通道 using (Operat ...
随机推荐
- Lua 学习笔记(一)环境搭建
Lua是一个小巧的脚本语言.Lua由标准C编写而成,代码简洁,几乎在所有的操作系统和平台上都可以编译,运行. 主要讲一下mac和win下的环境搭建. 工具: 1.Sublime Text 2 ...
- Java多线程系列--“基础篇”11之 生产消费者问题
概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...
- php常见的面试题目
一. 基本知识点1.1 HTTP协议中几个状态码的含义:503 500 401 403 404 200 301 302...200 : 请求成功,请求的数据随之返回.301 : 永久性重定向.302 ...
- Spring学习总结(一)——Spring实现IoC的多种方式
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...
- selenium处理select标签的下拉框
有时候我们会碰到<select></select>标签的下拉框.直接点击下拉框中的选项不一定可行.Selenium专门提供了Select类来处理下拉框. <select ...
- Codrops 教程:基于 CSS3 的精美模态窗口效果
Codrops 分享了漂亮的模态窗口效果实现方法,希望给前端开发人员提供一些创新显示对话框的启示.这个方案使用了触发按钮(或任何的 HTML 元素),在点击的时候出现一个模态窗口,带有简单的过渡(或动 ...
- 【Android】[转] Android Handler应设为static
android开发中,使用Lint检测时会提示这么一句话 : This Handler class should be static or leaks might occur.意为handler应用s ...
- Jquery基本用法总结
选择器$("#mydiv") 通过ID$("p#myp") 选择id=myp 的所有p元素(组合型)$(".mydiv") 通过 class ...
- 使用Qt installer framework制作安装包
一.介绍 使用Qt库开发的应用程序,一般有两种发布方式:(1)静态编译发布.这种方式使得程序在编译的时候会将Qt核心库全部编译到一个可执行文件中.其优势是简单单一,所有的依赖库都集中在一起,其缺点也很 ...
- LINUX总结
LINUX总结 crazyacking 2016-02-26 主要对socket编程,多线程,定时器,条件变量总结 多线程篇 概念: 多线程就是允许一个进程内存存在多个控制权,实现多个线程并发执行. ...