在WCF中,每个终结点都包含两个不同的地址——逻辑地址和物理地址。逻辑地址就是终结点Address属性表示的地址。至于物理地址,对于消息发送放来讲,就是消息被真正发送的目的地址;而对于消息的接收放来讲,就是监听器真正监听的地址。
一、服务端的物理地址
在默认的情况下,终结点的逻辑地址和物理地址是同一个URI。换句话说,终结的逻辑地址是必须的,如何物理地址没有指定的,默认使用逻辑地址作为物理地址。对于消息接收方的终结点来讲,物理地址就是监听地址,通过ServiceEndpoint的ListenUri表示:
1: //---------------------------------------------------------------
<!--CRLF-->
2: // EndpointAddress & WCF Addressing (c) by 2008 Jiang Jin Nan
<!--CRLF-->
3: //---------------------------------------------------------------
<!--CRLF-->
4: public class ServiceEndpoint
<!--CRLF-->
5: {
<!--CRLF-->
6: ... ...
<!--CRLF-->
7: public Uri ListenUri { get; set; }
<!--CRLF-->
8: }
<!--CRLF-->
在对服务进行寄宿的时候,我们可以调用SeriviceHostBase或者ServiceHost的AddServiceEndpoint对应的重载来为添加的终结点指定ListenUri:
1: //---------------------------------------------------------------
<!--CRLF-->
2: // EndpointAddress & WCF Addressing (c) by 2008 Jiang Jin Nan
<!--CRLF-->
3: //---------------------------------------------------------------
<!--CRLF-->
4: public abstract class ServiceHostBase : CommunicationObject, IExtensibleObject<ServiceHostBase>, IDisposable
<!--CRLF-->
5: {
<!--CRLF-->
6: //... ...
<!--CRLF-->
7: public ServiceEndpoint AddServiceEndpoint(string implementedContract, Binding binding, string address, Uri listenUri);
<!--CRLF-->
8: public ServiceEndpoint AddServiceEndpoint(string implementedContract, Binding binding, Uri address, Uri listenUri);
<!--CRLF-->
9: }
<!--CRLF-->
10:
<!--CRLF-->
11: public class ServiceHost : ServiceHostBase
<!--CRLF-->
12: {
<!--CRLF-->
13: //... ...
<!--CRLF-->
14: public ServiceEndpoint AddServiceEndpoint(Type implementedContract, Binding binding, string address, Uri listenUri);
<!--CRLF-->
15: public ServiceEndpoint AddServiceEndpoint(Type implementedContract, Binding binding, Uri address, Uri listenUri);
<!--CRLF-->
16: }
<!--CRLF-->
17:
<!--CRLF-->
在下面的代码片断中,就为终结点指定了一个同于逻辑地址的物理地址(ListenUri):
1: //---------------------------------------------------------------
<!--CRLF-->
2: // ListenUri.cs (c) by 2008 Jiang Jin Nan
<!--CRLF-->
3: //---------------------------------------------------------------
<!--CRLF-->
4: using (ServiceHost serviceHost = new ServiceHost(typeof(CalculateService)))
<!--CRLF-->
5: {
<!--CRLF-->
6: serviceHost.AddServiceEndpoint(typeof(ICalculate),new WSHttpBinding(),
<!--CRLF-->
7: "http://127.0.0.1:9999/calculateservice",
<!--CRLF-->
8: new Uri ("http://127.0.0.1:8888/calculateservice"));
<!--CRLF-->
9: Console.Read();
<!--CRLF-->
10: }
<!--CRLF-->
11:
<!--CRLF-->
当然,ListenUri也可以通过配置进行指定,下面的配置和上面的代码是等效的:
1: <configuration>
<!--CRLF-->
2: <system.serviceModel>
<!--CRLF-->
3: <services>
<!--CRLF-->
4: <service name="Artech.WcfServices.Services.CalculateService">
<!--CRLF-->
5: <endpoint binding="wsHttpBinding"
<!--CRLF-->
6: contract="Artech.WcfServices.Contracts.ICalculate" address="http://127.0.0.1:8888/calculateservice"
<!--CRLF-->
7: listenUri="http://127.0.0.1:8888/calculateservice" />
<!--CRLF-->
8: </service>
<!--CRLF-->
9: </services>
<!--CRLF-->
10: </system.serviceModel>
<!--CRLF-->
11: </configuration>
<!--CRLF-->
12:
<!--CRLF-->
二、客户端的物理地址
上面我们介绍了基于消息接收端终结点物理地址的指定,现在我们来介绍对于消息发送端的终结点,物理地址如何指定。在上面我们说过,对于消息的发送端来讲,物理地址其实就是消息发送的真正目的地址。该地址通过一个特殊的EndpointBehavior,ClientViaBehavor来指定。ClientViaBehavor定义的Uri代表该物理地址。
1: //---------------------------------------------------------------
<!--CRLF-->
2: // EndpointAddress & WCF Addressing (c) by 2008 Jiang Jin Nan
<!--CRLF-->
3: //---------------------------------------------------------------
<!--CRLF-->
4: public class ClientViaBehavior : IEndpointBehavior
<!--CRLF-->
5: {
<!--CRLF-->
6: //... ...
<!--CRLF-->
7: public Uri Uri { get; set; }
<!--CRLF-->
8: }
<!--CRLF-->
ClientViaBehavor是WCF自定的EndpointBehavior, 我们可以通过下面的配置应用该ClientViaBehavor。通过<endpointBehaviors>下的<clientVia〉配置节,通过viaUri设置了一个不同于终结点地址(http://127.0.0.1:9999/calculateservice)的物理地址:http://127.0.0.1:8888/calculateservice。
1: <?xml version="1.0" encoding="utf-8" ?>
<!--CRLF-->
2: <configuration>
<!--CRLF-->
3: <system.serviceModel>
<!--CRLF-->
4: <behaviors>
<!--CRLF-->
5: <endpointBehaviors>
<!--CRLF-->
6: <behavior name="clientViaBehavior">
<!--CRLF-->
7: <clientVia viaUri="http://127.0.0.1:8888/calculateservice" />
<!--CRLF-->
8: </behavior>
<!--CRLF-->
9: </endpointBehaviors>
<!--CRLF-->
10: </behaviors>
<!--CRLF-->
11: <client>
<!--CRLF-->
12: <endpoint address="http://127.0.0.1:9999/calculateservice" behaviorConfiguration="clientViaBehavior"
<!--CRLF-->
13: binding="wsHttpBinding" bindingConfiguration="" contract="Artech.WcfServices.Contracts.ICalculate"
<!--CRLF-->
14: name="calculateservice">
<!--CRLF-->
15: </endpoint>
<!--CRLF-->
16: </client>
<!--CRLF-->
17: </system.serviceModel>
<!--CRLF-->
18: </configuration>
<!--CRLF-->
三、ListenUri和ListenUriMode
上面我们介绍了终结点的ListenUri属性用于指定一个用于网络监听的物理地址,我们接下来讨论与ListenUri相关的另一个概念——ListenUriMode。ListenUriMode代表的是确定真正监听地址的模式。ListenUriMode通过System.ServiceModel.Description.ListenUriMode枚举表示,而ListenUriMode定义了两个枚举值:Explicit和Unique。
1: //---------------------------------------------------------------
<!--CRLF-->
2: // EndpointAddress & WCF Addressing (c) by 2008 Jiang Jin Nan
<!--CRLF-->
3: //---------------------------------------------------------------
<!--CRLF-->
4: public enum ListenUriMode
<!--CRLF-->
5: {
<!--CRLF-->
6: Explicit,
<!--CRLF-->
7: Unique
<!--CRLF-->
8: }
<!--CRLF-->
ListenUriMode.Explicit表示显示采用终结点ListenUri属性设置的Uri作为最终的监听地址;而Unique则根据ListenUri采用不同的策略保证最终使用的监听地址是唯一的。而对于如何确保监听地址的唯一性,WCF采用如下的策略:
-
如果采用TCP作为传输协议,在不采用端口共享的情况下,会选择一个未被使用的端口作为最终监听地址的端口一确保地址的唯一性
-
如果采用TCP作为传输协议,同时采用端口共享情况下,会添加一个GUID作为后缀以确保地址的唯一性
-
对于非TCP作为传输协议,会添加一个GUID作为后缀以确保地址的唯一性
在ServiceEndpoint中,定义了一个ListenUriMode属性,用于指定终结点的ListenUriMode。
1: //---------------------------------------------------------------
<!--CRLF-->
2: // EndpointAddress & WCF Addressing (c) by 2008 Jiang Jin Nan
<!--CRLF-->
3: //---------------------------------------------------------------
<!--CRLF-->
4: public class ServiceEndpoint
<!--CRLF-->
5: {
<!--CRLF-->
6: //... ...
<!--CRLF-->
7: public Uri ListenUri { get; set; }
<!--CRLF-->
8: public ListenUriMode ListenUriMode { get; set; }
<!--CRLF-->
9: }
<!--CRLF-->
10:
<!--CRLF-->
在对服务进行寄宿的时候,我们可以通过代码的方式为添加的终结点指定ListenUriMode。下面的代码将终结点设置成ListenUriMode.Unique.
Co
分享到:
相关推荐
**WCF之旅:一个简单的WCF程序** ...总结,WCF之旅是一个从零开始接触和学习WCF的好起点,通过实践一个简单的程序,你可以了解到服务的创建、配置、调用等基础操作,为后续深入学习WCF和其他相关技术打下坚实的基础。
在这个“WCF我的WCF之旅示例代码”中,我们可以看到一系列逐步进阶的代码示例,这些示例有助于理解WCF的核心概念和技术。 首先,我们要了解WCF的基本组成部分: 1. **服务**:服务是WCF中的核心元素,它定义了对外...
我的WCF之旅- 创建一个简单的WCF程序 - Artech WCF入门之选绝佳的例子 代源源于:《WCF全面解析 上》 编程工具:VS2010 语言:C# blog 《IIS站点中部署 WCF项目》
**WCF之旅源代码——IIS寄宿与泛型序列化** Windows Communication Foundation(WCF)是微软.NET框架中用于构建分布式应用程序的服务模型。在这个源代码包中,我们聚焦于两个核心概念:IIS(Internet Information ...
**WCF(Windows Communication Foundation)**是微软.NET框架下的一个组件,用于构建、配置和部署服务。它提供了统一的编程模型,支持多种通信协议和数据格式,如HTTP、TCP、MSMQ等,使得服务可以跨平台、跨网络进行...
我的WCF之旅后续篇,呀,要大于20字符啊,废话一下
提供的"ReadMe.txt"文件可能包含了课程大纲、讲师介绍和学习指导,而"WCF分布式开发技术讲座_1_从.NET到WCF:WCF优势、学习方法、资源和路线图(免费试听30分钟).wmv"视频文件则是一个入门引导,涵盖了WCF的优势、...
本课件包含课件,及对应源部分,为本人所做课件,可以对照文档一步步实现代码,本课件对WebService 进行了简单的介绍,WCF简单的应用 ,可以布置到各种寄宿平台上,
8. **开发实例**:在“我的WCF之旅”中,你可能会遇到如何创建第一个WCF服务,如何发布和消费服务,以及如何处理异常和错误的实例。这些实例将帮助你理解WCF的实际应用和工作原理。 通过这个压缩包文件中的内容,你...
当一个WPF客户端连接到WCF服务时,有时我们需要获取该客户端的IP地址,以便进行日志记录、安全验证或性能分析等。以下是如何在C#中实现这一功能的详细步骤和相关知识点。 首先,了解WCF服务和客户端的基本交互。WCF...
**WCF技术专题:WCF入门与进阶** Windows Communication Foundation(WCF)是微软推出的一种面向服务的架构,用于构建可互操作的分布式应用程序。它整合了.NET框架中的多种通信技术,如ASMX、Remoting、Web ...
本系列学习源码涵盖了WCF的基础概念和重要特性,旨在帮助初学者逐步掌握WCF的核心技术。下面我们将深入探讨其中涉及的知识点。 1. **WCF单调服务**: 单调服务是最基础的服务类型,它提供单个操作或一组相关操作。...
标题中的“wcf案例和winform”涉及到的是Windows Communication Foundation(WCF)技术与Windows Forms(WinForms)的结合应用。WCF是.NET框架中的一种服务导向架构,用于构建分布式应用程序,而WinForms则是一种...
Artech的博客文章,我把它转成chm的格式给大家分享
WCF开发实战系列一:创建第一个WCF服务 WCF开发实战系列二:使用IIS发布WCF服务 WCF开发实战系列三:自运行WCF服务 WCF开发实战系列四:使用Windows服务发布WCF服务 WCF开发实战系列五:创建WCF客户端程序
**WCF服务器与客户端使用示例文件v0.2** 是一个.NET框架的示例项目,专注于演示如何在**.NET 4.0**环境中利用**Windows Communication Foundation (WCF)**技术实现全双工服务调用。这个示例涵盖了从创建服务到客户端...
我把WCF之旅制作了个电子书,为WCF做点贡献吧
3. **终结点**:服务通过终结点与外界交互,每个终结点包含地址、绑定和合同。 4. **数据契约**:定义服务间交换的数据结构。 5. **服务行为**:影响服务运行时行为的配置元素,如服务元数据、安全性等。 ### 第二...