在定义和寄宿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>

总结

要区分上述三个名称/命名空间其实不然,只要我们知道终结点三要素在WSDL具体对应什么。

WCF的三个名称/命名空间,你是否傻傻分不清楚?相关推荐

  1. [老老实实学WCF] 第三篇 在IIS中寄存服务

    老老实实学WCF 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包括定义和实现服务协定.配置服务.寄宿服务.通过添加服务引用的方式配置客户端并访问服务.我 ...

  2. 替换 wcf 消息传输中的 命名空间

    替换 wcf 消息传输中的 命名空间,http://vanacosmin.ro/Articles/Read/WCFEnvelopeNamespacePrefix 转载于:https://www.cnb ...

  3. VPU/NPU/TPU/GPU/CPU眼花缭乱,傻傻分不清楚?三百字讲明白

    VPU/NPU/TPU/GPU/CPU眼花缭乱,傻傻分不清楚?三百字讲明白 简介 详解 参考链接 简介 CPU,Centeral Processing Unit(中央处理器) GPU,Graphics ...

  4. ar vr mr 计算机技术,AR/VR/MR傻傻分不清?一图带你看懂三种虚拟现实技术

    原标题:AR/VR/MR傻傻分不清?一图带你看懂三种虚拟现实技术 AR.VR早已出现在我们生活中,丰富的AR手机游戏带来了新的娱乐方式,几十块就能买到的VR盒子插进手机就能马上"穿越&quo ...

  5. 查询只卖三种不同型号PC的厂商 (10 分)

    查询只卖三种不同型号PC的厂商 (10 分) 本题目要求编写SQL语句, 查询只卖三种不同型号PC的厂商. 注意:只卖pc 且只卖三种pc SELECT maker FROM (SELECT make ...

  6. WCF服务三:svc文件详解

    在前面的文章中讲述过WCF服务的宿主程序主要包括:三种,在那篇文章中,简单的描述了如何把一个WCF服务寄宿到IIS上面,这篇文章中将具体讲述如何把一个WCF服务寄宿到IIS上面. 一.新建一个WCF服 ...

  7. 十五天精通WCF——第三天 client如何知道server提供的功能清单

     通常我们去大保健的时候,都会找姑娘问一下这里能提供什么服务,什么价格,这时候可能姑娘会跟你口述一些服务或者提供一份服务清单,这样的话大 家就可以做到童嫂无欺,这样一份活生生的例子,在wcf中同样是一 ...

  8. ShardingSphere笔记(三):自定义分片算法 — 按月分表·真·自动建表

    ShardingSphere笔记(二):自定义分片算法 - 按月分表·真·自动建表 文章目录 ShardingSphere笔记(二):自定义分片算法 - 按月分表·真·自动建表 一. 前言 二. Sp ...

  9. 地脚螺钉直径系列_百科:螺栓、螺钉、螺丝三个概念,别再傻傻分不清!

    生活中,常常提到螺栓.螺钉.螺丝等,那它们的区别是什么呢?其实,标准的说法是没有螺丝和螺帽的.螺丝是俗称,带有外螺纹的都可称为"螺丝". 螺母的外形通常为六角形,内孔为内螺纹,用来 ...

最新文章

  1. TensorRT深度学习训练和部署图示
  2. pb怎么连接dll_跑步学不会这项技术,谈何PB?
  3. 与、或、短路或、自增、自减、的执行过程
  4. MybatisPlus学习(四)条件构造器Wrapper方法详解
  5. q7goodies事例_Java 8 Friday Goodies:SQL ResultSet流
  6. 使用Specs2和客户端API 2.0进行富有表现力的JAX-RS集成测试
  7. 四种方法实现数组交换
  8. 知识管理≈内容管理≈文档管理≈项目文档管理
  9. android随机崩溃莫名其妙,Android CrashHandler编写自己的异常捕获的方法
  10. LeetCode--265. 粉刷房子Ⅱ(动态规划)
  11. servlet container:tomcat jetty and undertow
  12. 用python画漂亮图-零基础用 Python 画图表,让你的论文更美观
  13. java字典类_Java字典类
  14. linux mongo 搭建+集群
  15. 论站长赚钱之七剑下天山
  16. NodeJs+mongoose实现搜索功能
  17. Bzoj3653 谈笑风生
  18. java -p_javap使用实例图解
  19. insmod: error inserting 'xxx.ko': -1 Invalid module format
  20. 最值得珍藏的420个生活小窍门

热门文章

  1. Tungsten Fabric SDN — Service Chain
  2. Openstack Nova 源码分析 — RPC 远程调用过程
  3. laravel cookie加密解密原理
  4. 升级10.11后使用CocoaPod出现-bash: pod: command not found 解决办法
  5. 演讲:创新思维框架(2016/北京/国家会议中心)
  6. Spring抛出异常_自动装配
  7. iOS开发 - 百度地图后台持续定位
  8. C#面向对象三大特性之二:继承
  9. 聊下并发和Tomcat线程数(Updated)
  10. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)