深入探究WCF4.0:从基础配置到动态服务发现
立即解锁
发布时间: 2025-08-26 01:29:14 阅读量: 7 订阅数: 9 


Windows Server AppFabric深度解析与实践
### 深入探究WCF 4.0:从基础配置到动态服务发现
#### 1. 端点配置基础
在WCF应用开发中,端点配置是一个关键环节。当创建`ServiceHost`实例并调用`Open`方法时,它会从应用配置文件构建内部服务描述,同时结合主机应用可能显式配置的内容。若配置的端点数量为零,`ServiceHost`会调用`AddDefaultEndpoints`方法,为服务描述添加一个或多个默认端点。
`AddDefaultEndpoints`方法会为服务实现的每个服务契约的每个基地址添加一个默认端点。例如,若服务实现了两个服务契约,且主机配置了一个基地址,该方法会为服务配置两个默认端点;若服务实现两个服务契约且主机配置了两个基地址(一个用于HTTP,一个用于TCP),则会配置四个默认端点。
WCF定义了传输协议方案(如`http`、`net.tcp`、`net.pipe`等)与WCF绑定之间的默认协议映射,可在`.NET 4.0`的`machine.config`文件中找到,示例如下:
```xml
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="basicHttpBinding"/>
<add scheme="net.tcp" binding="netTcpBinding"/>
<add scheme="net.pipe" binding="netNamedPipeBinding"/>
<add scheme="net.msmq" binding="netMsmqBinding"/>
</protocolMapping>
...
</system.serviceModel>
```
你可以通过修改`machine.config`文件在机器级别覆盖此默认映射,也可以在应用配置文件中覆盖特定协议方案的映射。WCF通过协议映射表确定使用的绑定后,会使用默认绑定配置来配置默认端点。若对内置绑定默认值不满意,可随时覆盖特定绑定的默认配置。
#### 2. 默认绑定配置
每个WCF绑定都有默认配置,除非主机应用为特定端点显式覆盖。在WCF 3.x中,需定义命名绑定配置,并通过`bindingConfiguration`属性应用到端点定义,操作繁琐且易出错。
假设Contoso网络存在连接和带宽问题,为提高服务在高峰时段的可持续性,开发人员决定实现特殊绑定配置,允许服务主机在打开、关闭、接收和发送操作时有更多时间。这需要在服务和客户端XML配置文件中添加新的绑定配置文件,示例如下:
```xml
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="ExtendedTimeout" closeTimeout="00:02:00" openTimeout="00:02:00"
receiveTimeout="00:10:00" sendTimeout="00:10:00" />
</basicHttpBinding>
</bindings>
<services>
<service name="Appraisal.WCF">
<endpoint address="" binding="basicHttpBinding"
bindingConfiguration="ExtendedTimeout" contract=" IClaimInfo" />
</service>
</services>
</system.serviceModel>
</configuration>
```
在上述示例中,`ExtendedTimeout`绑定配置通过更改默认超时持续时间来覆盖`basicHttpBinding`的默认值,但此绑定配置仅在通过`bindingConfiguration`属性应用到特定端点时才生效。
WCF 4.0允许通过省略绑定配置名称来定义默认绑定配置,这会促使WCF对使用该绑定但未显式设置绑定配置的任何端点使用该默认配置。例如,在控制台应用的`app.config`文件中添加以下内容,会使默认HTTP端点采用此默认`basicHttpBinding`配置,修改默认超时参数:
```xml
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding closeTimeout="00:02:00" openTimeout="00:02:00"
receiveTimeout="00:10:00" sendTimeout="00:10:00" />
</basicHttpBinding>
</bindings>
</system.serviceModel>
</configuration>
```
你可以将这些默认绑定配置添加到`machine.config`文件,使其在机器上运行的所有服务中生效;也可以在应用配置文件中按应用逐一定义。此功能提供了一种简单机制,可定义一组标准绑定默认值,供所有服务使用,而无需将绑定配置的复杂性强加给其他开发人员或IT/运维人员。
#### 3. 默认行为配置
WCF 4.0还允许为服务和端点定义默认行为配置,这在希望在解决方案中运行的所有服务或端点之间共享标准默认行为配置时可简化操作,与默认绑定配置的工作方式类似。
在WCF 3.x中,必须定义命名行为配置,并通过`behaviorConfiguration`属性应用到服务和端点。而在WCF 4.0中,可通过省略行为配置名称来定义默认行为配置。若更新Contoso控制台应用的`app.config`文件以使用新的服务行为,文件内容如下:
```xml
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding closeTimeout="00:02:00" openTimeout="00:02:00"
receiveTimeout="00:10:00" sendTimeout="00:10:00" />
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
```
上述示例为没有显式行为配置的任何服务启用了服务元数据。再次运行`Appraisal.ConsoleHost`服务主机控制台应用时,可浏览到基础HTTP地址以检索服务帮助页面和服务的WSDL定义。
#### 4. 标准端点
与默认端点相关的另一个新特性是标准端点。可将标准端点视为内置在WCF框架中的预配置端点定义,可重复使用。WCF 4.0内置了标准端点,用于定义通常不会更改的端点配置。例如,对于MEX端点,端点定义必须始终为服务契约指定`IMetadataExchange`,WCF提供了名为`mexEndpoint`的标准端点定义,避免在每种情况下都手动指定。
可通过名称引用这些标准端点,并将其用于自己的服务配置。`<endpoint>`元素现在有一个`kind`属性,可用于指定标准端点的名称。例如,Contoso开发人员若想为其Web服务配置MEX端点,可利用标准`mexEndpoint`定义,示例如下:
```xml
<configuration>
<system.serviceModel>
<services>
<service name="Appraisal.WCF.AppraisalService">
<endpoint address="" binding="wsHttpBinding"
contract="Appraisal.WCF.IClaimInfo" />
<endpoint address="mex" kind="mexEndpoint" />
</service>
</services>
</system.serviceModel>
</configuration>
```
注意,无需为`mexEndpoint`指定绑定或契约。
除标准`mexEndpoint`外,WCF 4.0还提供了一组预定义的标准端点,有助于为服务发现预配置一些默认功能,如`discoveryEndpoint`、`announcementEndpoint`、`udpDiscoveryEndpoint`和`ud
0
0
复制全文
相关推荐










