本文适合的读者 适合WCF初学者可以没有任何SOA和其他分布式开发经验 Address是什么? 一个要和服务端通讯的客户端要做的第一件事情就是搞清数据要发给谁?目的地在哪?而Address正是通过一个Uri来唯一标示一个WCF的终节点(EndPoint)的它标示了消息发送的目的地在WCF 数据通讯中它解决了服务在哪里的问题 Address的组成? Address在WCF中的用SystemServiceModelEndpointAddress对象来表示的它的结构如下 组成部分 作用 Uri 指示EndPoint的地址是必须的 Identity 能保证地址的唯一性当Uri一致的时候可以用Identity来区分EndPoint可有可无 Headers 为地址提供了一些附加信息用于SoapMessage Filter最后会添加到Soap消息的Header中 此外Address还包括IsAnonymous属性用于指示终节点是否能匿名访问 如何在配置文件中指定Address? 在配置文件中有两种方式可以指定Address一种是绝对地址方式另外是相对地址方式分别如下 绝对地址 <host> <baseAddresses> <add baseAddress = //localhost:/ /> </baseAddresses> </host> <endpoint address =//localhost:/Service binding=basicHttpBinding contract=Wcf_Address_ConfigIService> </endpoint> 相对地址 <host> <baseAddresses> <add baseAddress = //localhost:/ /> </baseAddresses> </host> <endpoint address =Service binding=basicHttpBinding contract=Wcf_Address_ConfigIService></endpoint> 在网上有人说绝对地址是通过将httpGetEnabled设置为true并且设置httpGetUrl为绝对地址是在设置endPoint的说法有些不准确因为在WCF中有两种地址一种是访问endPoint时候用到地址另外一种是服务描述的地址服务描述在wcf中被称作serviceMetadata通过它能够产生代理类比如我们做如下的设置 <serviceMetadata httpGetEnabled=True httpGetUrl=//localhost:/Service/> 只代表//localhost:/Service/?wsdl上能找到服务描述可以通//localhost:/Service/?wsdl生成代理类而不是将endPoint的地址设置为//localhost:/Service这点一定要注意不要受有些说法的误导 如何通过编程方式设置Address? 除了能在配置中设置Address外 还可以通过编程的方式来设置Address具体方法请参参见下面的代码示例 static void Main(string[] args) { EndpointAddress address = new EndpointAddress(); Binding binding = new BasicHttpBinding(); wcfIService service = new wcfServiceClient(binding address); ConsoleWriteLine(serviceGetData()); ConsoleRead(); } 上面的代码就是将endPoint的地址设置为了 Address有什么特殊应用? 在wcf中能够将服务同时发布到几个地址上面只要这些地址采用的都是一种访问方式这种一份程序多个发布地址的做法在以往的技术中是没有的 |