2010-08-05 56 views
3

我正在研究要在現有ASP.NET Web應用程序中託管的新WCF Web服務。當我嘗試運行服務的.svc文件時,我收到一個異常,它無法找到程序集的文件。WCF服務中令人難以置信的程序集加載(IIS 7)

無法加載文件或程序集「System.IdentityModel,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089」或其某個依賴項。該系統找不到指定的文件。

麻煩的是,這個服務似乎並沒有在任何地方引用這個(特定的)程序集。有一個引用的項目加載了System.IdentityModel,但它引用了3.0.0.0版本。實際上,所有這些項目的目標都是3.5運行時,並且在任何地方都沒有對任何4.0程序集的引用。

這裏是從Web.config爲Web應用程序的<compilation>標籤:

<compilation debug="true"> 
    <assemblies> 
    <clear/> 
    <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 
    <add assembly="System.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 
    <add assembly="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
    <add assembly="System.Configuration.Install, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 
    <add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
    <add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
    <add assembly="System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 
    <add assembly="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
    <add assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
    <add assembly="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 
    <add assembly="System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
    <add assembly="System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 
    <add assembly="System.EnterpriseServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 
    <add assembly="System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 
    <add assembly="System.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 
    <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
    <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
    <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
    <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
    </assemblies> 
</compilation> 

注:<clear />標籤後來被添加爲排除故障的嘗試。它似乎對行爲沒有任何影響。我添加它,因爲IIS配置管理器的「.NET編譯」選項卡給我一個錯誤,即System.Data被添加兩次,但顯然不在此文件中。添加<clear />照顧了我,但我無法找到在Machine.config中有問題的重複它,並沒有基地網站Web.config,所以我想知道如果有可能有某處我不看可能是問題的原因。

服務器運行帶有.NET 3.5 SP1的Server 2008。我在本地IIS安裝上遇到了同樣的問題(儘管使用System.Configuration而不是IdentityModel,但仍然...),該安裝位於Windows 7 x64和.NET 4.0上。

有誰知道它爲什麼試圖加載這個程序集(當只有版本3.0.0.0被引用),我能做些什麼來糾正它?

回答

1

我想出了這個問題,並認爲這可能有助於其他人可能遇到同樣的問題。

當WCF服務被激活時,部分流程使用Type.GetType(string)獲取表示服務合約實施的類型。因爲Type.GetType(string)要求目標類型爲下列之一:

  • 在調用程序集(在這種情況下,絕不會)
  • 在mscorlib程序(再次,它絕不會)
  • 全用裝配限定名稱指定

除非使用裝配限定名稱指定類型,否則它將失敗。由於這個原因(並且使用名稱空間限定的名稱更容易地指定服務類型),激活程序將掃描所有引用的程序集並調用Assembly.GetType(string)(它只能使用名稱空間限定的名稱),直到找到兼容的類型。

雖然我無法解釋4.0引用是從哪裏來的,但它必須在引用的程序集中。通過改變ServiceHost中的標籤。svc文件爲我的服務使用程序集限定名稱,WCF成功加載了服務。

相關問題