2014-03-12 30 views
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:發生錯誤 cr吃 system.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部署的錯誤之一,對吧?

+1

http://blogs.msdn.com/b/scicoria/archive/2010/06/10/spaces-in-type-attribute-for-behavior-extension-configuration-issues.aspx –

回答

5

這是一個已知的錯誤,由Shawn Cicoria在this blog post中記錄。

它沒有提到什麼時候錯誤得到解決,WCF配置類完全過於複雜,以縮小範圍。我想猜測,鑑於帖子的年齡,這是一個.NET 4.5的修補程序。由於安裝了4.0,客戶端網站發生故障。你會從你爲你的項目選擇的目標中更好地瞭解。

否則一個很好的演示是微軟有多難修復錯誤。

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來定位正確的框架版本),那麼這可能很不一樣。 'd增加了一個錯誤鏈接,但在許多地方引用它時,文章似乎已從MS Connect中刪除,因爲:)

+0

感謝您的輸入。我編輯了我的答案並添加了.Net版本信息。因此,儘管使用相同的.Net版本運行,但這些機器上安裝的版本有所不同。它可能是一個在4.5中「靜默」修復的bug,並且包含在運行4.5版的4.0版本中?如果我可以標記2個答案,我會因爲這個也是一個合理的答案;) – CrazyChief

+0

@CrazyChief關於.NET 4.5的有趣(不是真正的)事情是,它不是一個單獨的.NET版本。它覆蓋4.0。因此,即使您在項目中定位4.0,只要安裝4.5,就不再運行在4.0上(這在試圖調試內存轉儲時特別惱人,因爲4.5引入了對調試接口的重大更改) 。所以是的,如果確實只有4.5的解決方案,這將解釋很好的神祕:) – Luaan

相關問題