簡體   English   中英

使用自定義部分時,為什么必須在我的app.config中指定程序集而不是為web.config指定程序集

[英]Why do I have to specify the assembly in my app.config but not for my web.config when using custom sections

我的項目中有自定義部分。 以下行適用於來自web.config的Web API項目:

...
  <sectionGroup name="Project.Models">
    <section name="product" type="Project.Models.Configuration.ProductSettings" />
  </sectionGroup>
</configSections>  
<Project.Models>
   <product id="1" />    
</Project.Models>

運行單元測試時,出現以下錯誤:

System.Configuration.ConfigurationErrorsException:在為Project.Models / product創建配置節處理程序時發生錯誤:無法從程序集“ System.Configuration,版本= 4.0.0.0,文化=中性”中加載類型“ Project.Models.Configuration.ProductSettings” ,PublicKeyToken = b03f5f7f11d50a3a'。 無法從程序集“ System.Configuration,版本= 4.0.0.0,區域性=中性,PublicKeyToken = b03f5f7f11d50a3a”中加載類型“ Project.Models.Configuration.ProductSettings”。

從單元測試app.config引用此名稱時,為什么必須指定程序集名稱? 這解決了問題,但不確定為什么需要它。

<section name="product" type="Project.Models.Configuration.ProductSettings, Project.Models" />

這取決於執行代碼的主機。

無需額外檢查,您會發現在Configuration命名空間的內部工作中,將type屬性輸入到靜態方法Type.GetType(string typeName)

對於typeName參數,您可以在其說明中找到:

如果類型在當前正在執行的程序集中或在Mscorlib.dll中,則只需提供其名稱空間限定的類型名稱即可。

關鍵部分是當前正在執行的匯編 對於普通的應用程序域,對於運行單元測試(我認為是VS)的應用程序,似乎從來都不是這樣。

另一方面,ASP.NET Web托管提供了一個內部HttpConfigurationSystem類,該類重新實現了對GetSection的調用。 很難理解,但看起來內部類BuildManager會加載所有程序集並遍歷所有類型,以找到匹配的類型。

這解釋了行為上的差異。 建議始終指定程序集名稱。 在asp.net方案中,如果assemblyname存在於type參數中,則它會短路到Type.GetType調用,從而阻止加載和檢查Webapp的bin文件夾中的所有dll。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM