MEF错误“一次只能编写一个批次”

时间:2014-02-18 16:37:13

标签: c# azure mef azure-web-roles

我有一个网络角色,可以在Azure中提供网站。此站点使用[Import]属性导入数据存储库。这在大多数情况下都可以正常工作,但在适度负载下,偶尔会出现Currently composing another batch in this ComposablePartExportProvider. Only one batch can be composed at a time错误。

如何修复此错误?它已经成为应用程序中一个相当棘手的瓶颈,我确信有一个(相对)快速修复...我应该注意到我在Nuget中使用MEF.MVC4程序集。

我的Global.asax.cs来电RegisterMefApplication_Start()设置MEF方面的内容。

public static void RegisterMef()
{
    var container = ConfigureContainer();
    ControllerBuilder.Current.SetControllerFactory(new MefControllerFactory(container));
    GlobalConfiguration.Configuration.DependencyResolver = new MefDependencyResolver(container);
}

private static CompositionContainer ConfigureContainer()
{
    var assemblyCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
    var container = new CompositionContainer(assemblyCatalog, true);
    return container;
}

我的CompositionContainer设置为线程安全的,所以我很茫然。默认情况下共享创建策略,因此设置SatifsyImportsOnce将不会执行任何操作。

完全错误:

Currently composing another batch in this ComposablePartExportProvider. Only one batch can be composed at a time.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

    Exception Details: System.InvalidOperationException: Currently composing another batch in this ComposablePartExportProvider. Only one batch can be composed at a time.

    Source Error: 

    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

    Stack Trace: 


    [InvalidOperationException: Currently composing another batch in this ComposablePartExportProvider. Only one batch can be composed at a time.]
       System.ComponentModel.Composition.Hosting.ComposablePartExportProvider.Compose(CompositionBatch batch) +390
       MEF.MVC4.MefControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +126
       System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +81
       System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +270
       System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +86
       System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +12550511
       System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288

1 个答案:

答案 0 :(得分:0)

我通过不使用MEF.MVC4解决了这个问题,因为在适度加载时它的工具可能有错误(例如:同时100个用户请求)。我使用MEF2 here

在Application_Start()

 var catalog = new AggregateCatalog(new DirectoryCatalog("bin"));
 var container = new CompositionContainer(catalog, true);
 ControllerBuilder.Current.SetControllerFactory(new MefControllerFactory(container));
 GlobalConfiguration.Configuration.DependencyResolver = new MefDependencyResolver(container);
 CurrentContainer.SetCurrentContainer(container);