2010-03-13 35 views
3

我們在WCF服務上有一個插件系統,用於檢查位於bin文件夾中的庫是否存在某些裝配級屬性並加載它們。這允許基於哪個客戶端正在進行呼叫來定製某些服務呼叫。這在大多數情況下都很有效。但是,有時它似乎失去了dll,這導致服務恢復到每個客戶端的默認實現。到目前爲止,解決方案只是將dll文件移出bin文件夾,然後重新進入。這會導致asp.net拿起該文件,並且自定義設置再次開始工作。ASP.NET在bin目錄中忘記dll

我不知道爲什麼在一段時間之後會議會這樣錯過。任何想法可能會導致這種情況?

編輯:問題說明更清楚

我們的服務使用服務工廠來伸手,基於什麼客戶端調用代碼自定義實現。如果沒有自定義實現,我們發佈默認實現。我們使用GetAssemblies來檢查裝配了一個屬性的程序集,該屬性將它們指定爲自定義實現並將它們與客戶端關聯起來。問題是GetAssemblies會停止返回客戶端的自定義程序集,即使該庫仍保留在bin文件夾中。將dll從bin中移出,並回到它將解決問題大約一個星期,直到它再次發生爲止

+0

*什麼*不再使用自定義實現?你的代碼?你的意思是GetAssemblies()調用不會返回你認爲應該返回的程序集?這個問題沒有很清楚的描述。 – Cheeso 2010-03-23 19:41:20

+0

我們的服務使用服務工廠來根據客戶端調用代碼來發布自定義實現。如果沒有自定義實現,我們發佈默認實現。我們使用GetAssemblies來檢查裝配了一個屬性的程序集,該屬性將它們指定爲自定義實現並將它們與客戶端關聯起來。問題是GetAssemblies會停止返回客戶端的自定義程序集,即使該庫仍保留在bin文件夾中。將dll從bin中移出,然後回到它將解決該問題約一週,直到它再次發生。 – 2010-03-23 21:13:50

+0

您是否在事件日誌中收到任何錯誤或警告消息?此外,該盒子上運行的任何防病毒軟件? – SoftwareGeek 2010-03-25 02:27:34

回答

4

您遇到的問題必須與自動回收appdomain有關。顯然AppDomain的回收行爲與真正的重啓行爲不同。在回收時,它只會加載明確引用並根據需要加載的dll。看到這個鏈接 http://www.chrisvandesteeg.nl/2006/06/15/appdomain-recycle-different-from-real-restart/

GetAssemblies將只返回當前加載到appdomain中的程序集的事實,這可以解釋您在程序中獲得的異常。爲了安全起見,如果您正在處理插件類型庫,則應始終使用Assembly.LoadFrom掃描插件文件(dll)並顯式加載它們。另一種方法是在自定義主機(例如窗口服務)中從外部託管WCF服務,以使主機的生命週期不受IIS回收策略的限制。

閱讀本上的AppDomain回收 http://blogs.msdn.com/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx

+0

沒有接受選項了。這將是我會接受的答案。 – 2010-03-31 15:54:32

+0

可惜,我沒有得到賞金:頁 – 2010-04-01 04:03:02

0

如何加載程序集?下一個問題......爲什麼? bin目錄中的程序集應自動加載並可供引用它們的ASP.NET應用程序使用。也許你在這裏遇到了一些衝突......也就是說,訪問被拒絕,因爲一些其他線程/進程對程序集有一個打開的句柄。對不起,這是如此含糊,但這是唯一立即想到的事情。你可以使用FileMon或類似的工具來檢查它。

另外...你是什麼意思的「失去」DLL?你正在調用一些特定的方法來找到它,並失敗?什麼是錯誤?你是否檢查過事件查看器未處理的異常?

+0

我們調用AppDomain.CurrentDomain.GetAssemblies()並檢查它們是否有正確的屬性。如果他們這樣做,那麼我們使用它而不是默認的實現。通過「失去」我的意思是它不再使用自定義實現,而只是使用默認值。 – 2010-03-14 00:49:24

+0

*什麼*不再使用自定義實現?你的代碼?你的意思是GetAssemblies()調用不會返回你認爲應該返回的程序集?這個問題沒有很清楚的描述。 – Cheeso 2010-03-23 19:39:04

+0

我以爲程序集是懶加載的。我們在這裏有一個應用程序,它需要一些提示來看看需要什麼程序集,因爲核心應用程序沒有直接引用它。 – Ant 2010-03-24 03:30:24

0

GetAssemblies僅返回已加載的程序集列表。如果您尚未使用該程序集中的類型,則該程序尚未加載。您需要使用Assembly.Load從磁盤加載所需的程序集;/bin文件夾中的程序集不會自動加載到應用程序域中。

此外,您可能會考慮使用Managed Extensibility Framework (MEF),它專門用於處理您正在討論的功能。

0

大會提示路徑進行檢查只有一次,當你的AppDomain負載,即使你明確告訴它通過名字來加載程序集也不會發現它的更多信息。爲了解決這個問題,你需要重新加載你的主要AppDomain,或者創建一個輔助AppDomain並使用它來加載你的程序集,這是我在過去所做的並且工作正常。但它承擔了第二個AppDomain的開銷,並不確定這是否是一件大事。

相關問題