【发布时间】:2011-11-25 09:33:08
【问题描述】:
我们有很多 Web 应用程序,使用自定义部分(在其 web.config 中)进行配置,这些部分依赖于 machine.config 中声明的 sectionHandlers。
由于我们有这些sectionHandlers 的多个版本,因此想要使用新sectionHandlers 的应用程序必须通过在其web.config 中使用标签<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 来强制“程序集重定向”。我们确实不能修改machine.config中sectionHandlers的声明,只要还有其他应用程序使用最旧的版本。
绑定重定向适用于使用前面提到的标记的应用程序加载的所有程序集 - 除了包含用于在 web.config 的 system.serviceModel 部分中定义 WCF 行为的类型的程序集。
例如,我们的一些应用程序正在使用名为 mainframeFormatter 的自定义行为扩展(请参见后面示例中的 web.config)。将 bindingRedirect 从包含类型 mainframeFormatter 的程序集的 1.1.0.0 版本添加到 1.2.0.0 版本时,我们收到以下错误:
创建配置节处理程序时出错 system.serviceModel/behaviors: 扩展元素'mainframeFormatter' 无法添加到此元素。验证扩展是 在扩展集合中注册 system.serviceModel/extensions/behaviorExtensions。
请注意,我们只有“行为”问题,而不是“绑定”问题。 这是带有 WCF 行为的绑定重定向的预期行为还是一个错误?
下面是web.config 的示例,在使用绑定重定向时无法解析:
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="mainframeFormatter"
type="Framework.Communication.Mainframe.ClientEndpointBehaviorExtensionElement,
Framework.Communication.Mainframe, Version=1.1.0.0, Culture=neutral,
PublicKeyToken=f510307097254a31"/>
</behaviorExtensions>
<bindingExtensions>
<add name="mainframeBinding"
type="Framework.Communication.Mainframe.BindingCollectionElement,
Framework.Communication.Mainframe, Version=1.1.0.0, Culture=neutral,
PublicKeyToken=f510307097254a31"/>
</bindingExtensions>
</extensions>
<behaviors>
<endpointBehaviors>
<behavior name="ClientEndpointBehavior">
<mainframeFormatter /> <--- Problem is on parsing this with assemblyBinding enabled
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<mainframeBinding>
<binding name="MyCustomBinding"/>
</mainframeBinding>
</bindings>
</system.serviceModel>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Framework.Communication.Mainframe"
publicKeyToken="f510307097254a31" />
<bindingRedirect oldVersion="1.1.0.0" newVersion="1.2.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
我知道在behaviorExtension 设置中更改版本可以解决问题。但我很好奇为什么重定向不起作用。
【问题讨论】:
标签: asp.net .net wcf wcf-binding