2014-03-11

Portable Class Libraries導致的http 500錯誤

專案有一MVC4網站及WCF Service,兩者皆使用.Net 4.0的版本開發,於測試環境均正常,但部署到某新機器的IIS上,卻在執行時會讓IIS回傳http 500的錯誤;但兩台機器的程式版本是相同的,因此推測是新機器(VM)的環境問題所致。

於該VM的事件檢視器中,可以發現有一警告的Exception資訊如下:

Exception Details: System.IO.FileLoadException: Could not load file or assembly 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)
竟然是無法參考到System.Core!

參閱了網友的文章後,發現多與Autofac這套IoC Container相關,其中在Autofac的FAQ提到:
Autofac (as of 3.0) is a Portable Class Library that targets multiple platforms.......  Make sure your .NET framework is patched. Microsoft released patches to .NET to allow Portable Class Libraries to properly find the appropriate runtime (KB2468871). If you are seeing the above exception (or something like it), it means you're missing the latest .NET framework patches. 
由於Autofac是PCL(Portable Class Libraries)形式,需要安裝KB2468871的Patch,才能找到正確的runtime元件;無獨有偶,雖然我未使用Autofac,但我的程式中也有參考一個類似的PCL元件:AutoMapper,因此推測與Autofac雷同,於安裝該Patch後,果然順利解決此問題!

由於出事的VM是測試部署用,幾乎沒做過Windows Update,自然未安裝過該Patch,因此會引發此錯誤,另一台可正常執行的測試機,經事後查證後果然是有安裝過的。

順帶一提,AutoMapper是於3.0後才以PCL形式發佈,因此若沒有執行安裝Patch的權限,網路上大多的應急方式都是將AutoMapper的nuget package退回到參考2.x版本(非PCL)即可。


沒有留言:

張貼留言

引用 Topshelf 無法進行偵錯的經驗

Topshelf  是一個可以簡化撰寫 Windows Service 的套件,引用之後,我們只要當作撰寫一般 Console 的應用程式就可以。 只是近來撰寫上遇到無法進行Debug的狀況,在Visual Studio一進行偵錯可以看到Console 程式被執行,並顯示...