11

今天偶然发现了这个,我找不到任何关于它的信息。所以这就是我在这里问的原因。也许有人知道为什么。

我在 web.config 中添加了一个自定义 WCF 行为扩展。它看起来像这样:

<behaviorExtensions>
    <add name="errorBehavior" type="MyNs.TracingErrorBehaviorElement,MyNs, 
         Version=1.0.6.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>

(里面没有空格MyNs.TracingErrorBehaviorElement,MyNs:)

它在我的开发机器、我们的登台服务器、我们的实时服务器等上运行良好。

今天我们在客户服务器上安装了产品,出现以下异常:

System.Configuration.ConfigurationErrorsException:为 system.serviceModel/behaviors 创建配置节处理程序时发生错误:无法将扩展元素“errorBehavior”添加到此元素。验证扩展是否已在 system.serviceModel/extensions/behaviorExtensions... 的扩展集合中注册

在花了半个小时在网上搜索可能的原因后,我在完全限定的程序集名称中添加了空格。所以我把它改成:

<behaviorExtensions>
    <add name="errorBehavior" type="MyNs.TracingErrorBehaviorElement, MyNs, 
         Version=1.0.6.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>

(见空间MyNs.TracingErrorBehaviorElement, MyNs:)

它奏效了。

有谁知道为什么它在某些机器上没有空间而不在其他机器上工作?我检查了.Net-versions. 他们匹配。会不会是地域设置造成的?

编辑说:

我检查了所有机器上使用的 .Net 版本,它们都是相同的:.Net 4.0 但我发现出现缺失空白的错误的机器与其他机器之间存在差异:它工作的所有机器没有空白的已经安装了.Net Framework 4.5。所以它可能是在 4.0 中修复并在 4.5 中部署的错误之一,对吧?

4

2 回答 2

5

这是一个已知的错误,Shawn Cicoria在这篇博客文章中有记录。

它没有说明错误修复的确切时间,WCF 配置类完全过于复杂而无法缩小范围。我,考虑到帖子的年代,这是一个 .NET 4.5 修复程序。由于安装了 4.0,客户端站点出现故障。您会更好地了解您为项目选择的目标。

否则,这很好地证明了微软修复错误是多么困难。

于 2014-03-12T11:54:24.597 回答
3

嗯,MSDN 说:

空格在除程序集名称之外的所有类型名称组件中都是相关的。在程序集名称中,',' 分隔符之前的空格是相关的,但 ',' 分隔符之后的空格被忽略。

事实上,测试表明情况确实如此——GetType其他类型解析方法确实会忽略分隔符的空格,

但是,WCF 以某种方式使这变得复杂,因为它实际上要求完全限定的类型名称正是Type.AssemblyQualifiedName由于某种原因您从中获得的值。也许它在某处保留了类型的缓存,我不知道。

至于为什么这只发生在某些机器上,我将赌注押在 GAC 或其他稍微修改程序集/类型解析的系统上。由于您没有使用 snk,因此 GAC 是不可能的,但也许有一些配置会为您改变这一点,可能在 machine.config 中,或者如果它在 IIS 配置中的 Web 应用程序中。

这似乎是 .NET 3.5 中的配置错误。.NET 4.0+ 没有同样的问题。您确定应用程序运行的是相同版本的 .NET 吗?如果您使用的是 Web 应用程序,这很可能会有所不同(客户的服务器很可能配置为使用 .NET 3.5,事实上,您应该指定system.web.compilation[targetFramework]httpRuntime定位正确的框架版本。我会添加一个指向该错误的链接,但虽然它在很多地方被引用,但该文章似乎已从 MS Connect 中删除:)

于 2014-03-12T09:31:52.863 回答