[英]MEF under IIS is not loading parts
我在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%正确的。
我会同意@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应用程序中使用可执行程序集?
原因之一可能是path
值错误。
例如,您不应假定当前目录将是代码的"bin"
目录,因此应传递"."
可能不是一个好主意。
如果您正在这样做,请尝试根据Assembly.GetExecutingAssembly().Location
指定一个路径:
// using System.IO;
// using System.Reflection;
string binPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
LoadPlugins(binPath);
在控制台应用程序或Cassini和IIS中运行时的区别是安全上下文。
当运行控制台应用程序或cassini时,安全上下文是登录用户,即您。
在IIS下运行时,安全上下文是应用程序池的标识,默认情况下为网络服务。
您的MEF部件可能也位于NETWORK SERVICE也无法访问的目录中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.