每个终结点都有一个与之关联的地址,该地址用于查找和标识终结点。 此地址主要由统一资源标识符(URI)组成,该标识符指定终结点的位置。 终结点地址由 EndpointAddress 类在 Windows Communication Foundation (WCF) 编程模型中表示,该类包含一个可选 Identity 属性,该属性允许其他终结点对其交换消息的终结点进行身份验证,以及一组可选 Headers 属性,这些属性定义访问服务所需的任何其他 SOAP 标头。 可选标头提供其他和更详细的寻址信息,用于标识或与服务终结点交互。 终结点的地址在网络上表示为 WS-Addressing 终结点引用 (EPR)。
地址的 URI 结构
大多数传输的地址 URI 有四个部分。 例如,URI http://www.fabrikam.com:322/mathservice.svc/secureEndpoint
的四个部分可以按如下所示进行项化:
方案:
http:
计算机:
www.fabrikam.com
(可选)端口:322
路径:/mathservice.svc/secureEndpoint
定义服务的地址
可以使用代码以命令方式指定服务的终结点地址,或者通过配置以声明式方式指定。 在代码中定义终结点通常不可行,因为部署服务的绑定和地址通常不同于在开发服务时使用的终结点。 通常,使用配置而不是代码定义服务终结点更为实用。 将绑定和寻址信息从代码中保留允许更改,而无需重新编译或重新部署应用程序。
在配置中定义地址
若要在配置文件中定义终结点,请使用 <终结点> 元素。 有关详细信息和示例,请参阅 指定终结点地址。
在代码中定义地址
可以使用类在代码 EndpointAddress 中创建终结点地址。 有关详细信息和示例,请参阅 指定终结点地址。
WSDL 中的终结点
终结点地址也可以在 WSDL 中表示为相应终结点 wsdl:port
元素内的 WS-Addressing EPR 元素。 EPR 包含终结点的地址以及任何地址属性。 有关详细信息和示例,请参阅 指定终结点地址。
.NET Framework 3.5 中的多个 IIS 绑定支持
Internet 服务提供商通常在同一服务器和站点上托管许多应用程序,以提高站点密度并降低总拥有成本。 这些应用程序通常绑定到不同的基址。 Internet Information Services (IIS) 网站可以包含多个应用程序。 可以通过一个或多个 IIS 绑定访问站点中的应用程序。
IIS 绑定提供两条信息:绑定协议和绑定信息。 绑定协议定义通信发生的方案,绑定信息是用于访问站点的信息。
以下示例显示了 IIS 绑定中可以存在的组件:
绑定协议:HTTP
绑定信息:IP 地址、端口、主机标头
IIS 可以为每个站点指定多个绑定,这会导致每个方案的多个基址。 在 .NET Framework 3.5 之前,WCF 不支持一个方案有多个地址;如果指定了多个地址,则在激活期间引发 ArgumentException。
.NET Framework 3.5 使 Internet 服务提供商能够在同一站点上为同一方案托管具有不同基址的多个应用程序。
例如,站点可以包含以下基址:
http://payroll.myorg.com/Service.svc
http://shipping.myorg.com/Service.svc
使用 .NET Framework 3.5,可以在配置文件中的 AppDomain 级别指定前缀筛选器。 使用 <baseAddressPrefixFilters> 元素来实现此操作,该元素包含前缀列表。 IIS 提供的传入基址根据可选的前缀列表进行筛选。 默认情况下,如果未指定前缀,则会传递所有地址。 指定前缀导致仅使该方案的匹配基址通过。
下面是使用前缀筛选器的配置代码示例。
<system.serviceModel>
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="net.tcp://payroll.myorg.com:8000"/>
<add prefix="http://shipping.myorg.com:8000"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
</system.serviceModel>
在前面的示例中,net.tcp://payroll.myorg.com:8000
和 http://shipping.myorg.com:8000
是其各自方案中唯一传递的基址。
baseAddressPrefixFilter
不支持通配符。
IIS 提供的基址中可能存在绑定到列表 baseAddressPrefixFilters
中不存在的其他方案的地址。 不会筛选掉这些地址。
.NET Framework 4 以及更高版本中的多个 IIS 绑定支持
从 .NET 4 开始,可以在 IIS 中启用对多个绑定的支持,而无需选择单个基址,方法是将 ServiceHostingEnvironment“ MultipleSiteBindingsEnabled 设置设置为 true”。 此支持仅限于 HTTP 协议方案。
下面是在 serviceHostingEnvironment< 上使用> multipleSiteBindingsEnabled 的配置代码示例。
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" >
</serviceHostingEnvironment>
</system.serviceModel>
当使用此设置启用多个站点绑定时,对于 HTTP 和非 HTTP 协议,将忽略任何 baseAddressPrefixFilters 设置。
有关详细信息和示例,请参阅 支持多个 IIS 站点绑定 和 MultipleSiteBindingsEnabled。
在 WCF 服务中扩展寻址
WCF 服务的默认寻址模型使用终结点地址 URI 用于以下目的:
指定服务侦听地址,即终结点侦听消息的位置,
指定 SOAP 地址筛选器,即终结点期望作为 SOAP 头的地址。
可以单独指定用于其中每个目的的值,从而允许涉及有用方案的若干寻址扩展:
SOAP 中介:客户端发送的消息会遍历一个或多个处理消息的其他服务,然后再到达其最终目标。 SOAP 中介可以对消息执行各种任务,例如缓存、路由、负载均衡或架构验证。 此方案是通过将消息发送到单独的物理地址(
via
,以媒介为目标),而不是仅发送到逻辑地址(wsa:To
,以最终目的地为目标)完成的。终结点的侦听地址是专用 URI,设置为不同于其
listenURI
属性的值。
指定的传输地址 via
是消息最初应发送到的地点,然后再传送到由参数 to
指定的服务所在的其他远程地址。 在大多数 Internet 方案中, via
URI 与 Uri 服务最终 to
地址的属性相同。 只有在执行手动路由时,才区分这两个地址。
寻址头
除了基本 URI 外,终结点还可以由一个或多个 SOAP 标头进行寻址。 一组非常有用的方案是一组 SOAP 中介方案,其中终结点要求该终结点的客户端包含针对中介的 SOAP 标头。
可以通过两种方式定义自定义地址标头,方法是使用代码或配置:
在代码中,使用 AddressHeader 类创建自定义地址标头,然后用于构造 EndpointAddress。
配置通常优于代码,因为它允许在部署后更改标头。
自定义侦听地址
可以将侦听地址设置为与终结点 URI 不同的值。 这在中间情况下非常有用,其中公开的 SOAP 地址属于一个公共 SOAP 中介,而终结点实际侦听的地址是专用网络地址。
可以使用代码或配置指定自定义侦听地址:
在代码中,通过将一个类添加到 ClientViaBehavior 端点的行为集合来指定自定义侦听地址。
在配置中,使用
ListenUri
服务 <终结点> 元素的属性指定自定义侦听地址。
自定义 SOAP 地址筛选器
Uri 与任何 Headers 属性结合使用,以定义终结点的 SOAP 地址筛选器(AddressFilter)。 默认情况下,此筛选器验证传入消息是否具有 To
与终结点的 URI 匹配的消息标头,以及消息中是否存在所有必需的终结点标头。
在某些情况下,终结点接收到达基础传输的所有消息,而不仅仅是那些具有相应 To
标头的消息。 若要启用此功能,用户可以使用该 MatchAllMessageFilter 类。