为什么完全限定程序集名称有时需要空格

本文关键字:空格 程序集 为什么 | 更新日期: 2023-09-27 17:49:34

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

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

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

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

在我的开发机器上,在我们的临时服务器上,在我们的实时服务器上,等等。

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

System.Configuration。ConfigurationErrorsException:发生错误的配置节处理程序系统。serviceModel/behaviors:扩展元素errorBehavior不能添加到此元素。验证扩展是否为在扩展集合中注册system.serviceModel/扩展/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中部署的错误之一,对吗?

为什么完全限定程序集名称有时需要空格

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

它没有说任何关于这个bug是什么时候修复的,WCF配置类完全太复杂了,无法缩小范围。我猜测,考虑到这篇文章的年龄,这是一个。net 4.5修复。由于安装了4.0,在客户端站点上出现了故障。从你为你的项目选择的目标中你会知道得更好。

这是一个很好的例子,说明微软修复bug是多么困难。

MSDN说:

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

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

然而,WCF在某种程度上使这变得复杂,因为它实际上要求完全限定类型名称完全是您出于某种原因从Type.AssemblyQualifiedName获得的值。也许它在某个地方保存了一个类型缓存,我不知道。

至于为什么这只发生在某些机器上,我打赌是GAC或其他稍微修改汇编/类型分辨率的系统。由于您没有使用snk,所以GAC是不可能的,但是也许有一些配置可以为您改变这一点,也许在机器中。如果是在IIS配置的web应用程序中,

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