2012-07-13 67 views
0

我在iis下加載mef部件時遇到問題。加載方法如下所示:IIS下的MEF未加載部件

private void LoadPlugins(string path) 
{ 
    var aggregateCatalog = new AggregateCatalog(); 
    var directoryCatalogExe = new DirectoryCatalog(path, "*.exe"); 
    aggregateCatalog.Catalogs.Add(directoryCatalogExe); 
    var container = new CompositionContainer(aggregateCatalog); 
    container.ComposeParts(this); 
} 

該方法在控制檯應用程序或卡西尼中完美工作。在iis下,零件數爲0 - 沒有錯誤,在事件日誌中沒有異常,沒有任何...

我完全不知道發生了什麼事。路徑是100%正確的。

+1

你將什麼值作爲'路徑'傳遞給LoadPlugins? – 2012-07-13 11:06:13

+0

HttpContext.Current.Server.MapPath(configPath)其中configPath看起來像「〜\ Plugin」。最後,路徑= D:\ TFS \ Projects \ WebTools \ trunc \ WebTools.UI.Web \ Plugins – eye 2012-07-13 11:55:48

回答

1

對此的一個可能的原因可能是path的錯誤值。

例如,您不應該認爲當前目錄將是您的代碼的"bin"目錄,因此傳遞"."可能不是一個好主意。

如果這是你在做什麼,可以嘗試使用基於Assembly.GetExecutingAssembly().Location的路徑:

// using System.IO; 
// using System.Reflection;  

string binPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
LoadPlugins(binPath); 
0

的差異,當你在一個控制檯應用程序或運行的卡西尼和IIS的安全上下文。

運行控制檯應用程序或cassini時,安全上下文是已登錄的用戶,即您。

在IIS下運行時,安全上下文是應用程序池的標識,默認爲NETWORK SERVICE。

這可能是您的MEF部件位於NETWORK SERVICE無法訪問的目錄中。

2

我會同意@stakx的評估。我使用不同的方法創建容器,使其更加環境不可知。我創建一個接口:

/// <summary> 
/// Defines the required contract for implementing a composition container factory. 
/// </summary> 
public interface ICompositionContainerFactory 
{ 
    #region Methods 
    /// <summary> 
    /// Creates an instance of <see cref="CompositionContainer"/>. 
    /// </summary> 
    /// <returns>An instance of <see cref="CompositionContainer"/>.</returns> 
    CompositionContainer CreateCompositionContainer(); 
    #endregion 
} 

隨着默認實現(在控制檯應用程序的工作原理,服務主機):

public class DefaultCompositionContainerFactory : ICompositionContainerFactory 
{ 
    #region Methods 
    /// <summary> 
    /// Creates an instance of <see cref="CompositionContainer"/>. 
    /// </summary> 
    /// <returns> 
    /// An instance of <see cref="CompositionContainer"/>. 
    /// </returns> 
    public CompositionContainer CreateCompositionContainer() 
    { 
     var domain = AppDomain.CurrentDomain; 
     string path = domain.BaseDirectory; 

     // Use the base directory from where the application is running. 
     var catalog = new DirectoryCatalog(path); 

     // Create the container. 
     var container = new CompositionContainer(catalog); 

     return container; 
    } 
    #endregion 
} 

而一個網絡具體實施:

public class WebCompositionContainerFactory : ICompositionContainerFactory 
{ 
    #region Methods 
    /// <summary> 
    /// Creates an instance of <see cref="CompositionContainer"/>. 
    /// </summary> 
    /// <returns> 
    /// An instance of <see cref="CompositionContainer"/>. 
    /// </returns> 
    public CompositionContainer CreateCompositionContainer() 
    { 
     string path = HttpRuntime.BinDirectory; 

     // Use the base directory from where the application is running. 
     var catalog = new DirectoryCatalog(path); 

     // Create the container. 
     var container = new CompositionContainer(catalog); 

     return container; 
    } 
    #endregion 
} 

我通過配置連線。

要考慮的另一件事是,您正在傳遞* .exe作爲您的目錄過濾器,您是否在您的Web應用程序中使用可執行程序集?