C# Autofac global.asax在MVC 5.1中使用任务时出错

C# Autofac global.asax在MVC 5.1中使用任务时出错,c#,asp.net-mvc,task,autofac,c#-5.0,C#,Asp.net Mvc,Task,Autofac,C# 5.0,我在global.asax.cs文件中使用应用程序事件设置了一系列任务,如下所示: // Note: For instructions on enabling IIS7 classic mode, // visit http://go.microsoft.com/?LinkId=301868 public class MvcApplication : System.Web.HttpApplication { private static IContainer ContainerGlobal;

我在global.asax.cs文件中使用应用程序事件设置了一系列任务,如下所示:

// Note: For instructions on enabling IIS7 classic mode, 
// visit http://go.microsoft.com/?LinkId=301868
public class MvcApplication : System.Web.HttpApplication
{
private static IContainer ContainerGlobal;
private static ILogger Logger;

public ILifetimeScope Container
{
    get { return (ILifetimeScope)HttpContext.Current.Items["_Container"]; }
    set { HttpContext.Current.Items["_Container"] = value; }
}

protected void Application_Start()
{
    AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;

    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    //configure the Autofac IoC container
    var container = AutofacBuilder.Configure(Assembly.GetExecutingAssembly(),
        new MvcModule(), new TaskModule());

    // startup the logging
    var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase)
        .Replace("file:\\", string.Empty);
    var file = new FileInfo(path + @"\log4net.ui.config");
    Logger = new Logger(MethodBase.GetCurrentMethod().DeclaringType, file);

    var runAtInits = container.Resolve<IEnumerable<IRunAtInit>>();

    if (runAtInits != null)
    {
        Logger.LogFormat(LogType.Debug, "Found {0} IRunAtInit instances", 
            runAtInits.Count());

        foreach (var task in runAtInits)
        {
            task.Execute();
        }
    }

    var runAtStartups = container.Resolve<IEnumerable<IRunAtStartup>>();

    if (runAtStartups != null)
    {
        Logger.LogFormat(LogType.Debug, "Found {0} IRunAtStartup instances", 
            runAtStartups.Count());

        foreach (var task in runAtStartups)
        {
            task.Execute();
        }
    }

    ContainerGlobal = container;
}

public void Application_BeginRequest()
{
    try
    {
        Container = ContainerGlobal.BeginLifetimeScope();

        var runOnEachRequests = 
            Container.Resolve<IEnumerable<IRunOnEachRequest>>();

        if (runOnEachRequests == null)
            return;

        Logger.LogFormat(LogType.Debug, "Found {0} IRunOnEachRequest instances", 
            runOnEachRequests.Count());

        foreach (var task in runOnEachRequests)
        {
            task.Execute();
        }
    }
    catch(Exception ex)
    {
        Logger.Log(LogType.Error, ex);
    }
}

public void Application_Error()
{
    try
    {
        var runOnErrors = Container.Resolve<IEnumerable<IRunOnError>>();

        if (runOnErrors == null)
            return;

        Logger.LogFormat(LogType.Debug, "Found {0} IRunOnError instances", 
            runOnErrors.Count());

        foreach (var task in runOnErrors)
        {
            task.Execute();
        }
    }
    catch (Exception ex)
    {
        Logger.Log(LogType.Error, ex);
    }
}

public void Application_EndRequest()
{
    try
    {
        var runAfterEachRequests = 
            Container.Resolve<IEnumerable<IRunAfterEachRequest>>();

        if (runAfterEachRequests == null)
            return;

        Logger.LogFormat(LogType.Debug, "Found {0} IRunAfterEachRequest instances",
            runAfterEachRequests.Count());

        foreach (var task in runAfterEachRequests)
        {
            task.Execute();
        }
    }
    catch (Exception ex)
    {
        Logger.Log(LogType.Error, ex);
    }
    finally
    {
        if (Container != null)
        {
            Container.Dispose();
            Container = null;
        }
    }
}
}
//注意:有关启用IIS7经典模式的说明,
//拜访http://go.microsoft.com/?LinkId=301868
公共类MVC应用程序:System.Web.HttpApplication
{
专用静态IContainer ContainerGlobal;
专用静态ILogger记录器;
公共ILifetimeScope容器
{
获取{return(ILifetimeScope)HttpContext.Current.Items[“_Container”];}
设置{HttpContext.Current.Items[“\u Container”]=value;}
}
受保护的无效应用程序\u Start()
{
AntiForgeryConfig.UniqueClaimTypeIdentifier=ClaimTypes.NameIdentifier;
RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//配置Autofac IoC容器
var container=AutofacBuilder.Configure(Assembly.getExecutionGassembly(),
新MvcModule(),新TaskModule());
//启动日志记录
var path=path.GetDirectoryName(Assembly.getExecutionGassembly().CodeBase)
.Replace(“文件:\\”,string.Empty);
var file=newfileinfo(路径+@“\log4net.ui.config”);
Logger=新的记录器(MethodBase.GetCurrentMethod().DeclaringType,文件);
var runatits=container.Resolve();
if(runatits!=null)
{
Logger.LogFormat(LogType.Debug,“找到{0}个IRunAtInit实例”,
runatits.Count());
foreach(runatits中的var任务)
{
task.Execute();
}
}
var runAtStartups=container.Resolve();
if(runAtStartups!=null)
{
Logger.LogFormat(LogType.Debug,“找到{0}个启动实例”,
runAtStartups.Count());
foreach(runAtStartups中的var任务)
{
task.Execute();
}
}
ContainerGlobal=容器;
}
公共无效应用程序_BeginRequest()
{
尝试
{
Container=ContainerGlobal.BeginLifetimeScope();
var runOnEachRequests=
Container.Resolve();
if(runOnEachRequests==null)
返回;
Logger.LogFormat(LogType.Debug,“找到{0}个请求实例”,
runOnEachRequests.Count());
foreach(runOnEachRequests中的var任务)
{
task.Execute();
}
}
捕获(例外情况除外)
{
Logger.Log(LogType.Error,ex);
}
}
公共无效应用程序_错误()
{
尝试
{
var runOnErrors=Container.Resolve();
if(runOnErrors==null)
返回;
Logger.LogFormat(LogType.Debug,“找到{0}个IruNoError实例”,
runOnErrors.Count());
foreach(Runonerror中的var任务)
{
task.Execute();
}
}
捕获(例外情况除外)
{
Logger.Log(LogType.Error,ex);
}
}
公共无效应用程序_EndRequest()
{
尝试
{
var runAfterEachRequests=
Container.Resolve();
if(runAfterEachRequests==null)
返回;
Logger.LogFormat(LogType.Debug,“找到{0}个IRunAfterEachRequest实例”,
runAfterEachRequests.Count());
foreach(runAfterEachRequests中的var任务)
{
task.Execute();
}
}
捕获(例外情况除外)
{
Logger.Log(LogType.Error,ex);
}
最后
{
if(容器!=null)
{
Container.Dispose();
Container=null;
}
}
}
}
Matt Honeycut在这里对此进行了讨论:

由于我们在整个应用程序中广泛使用Autofac,因此我们使用Autofac而不是Structuremap来实现它

问题是,我们会为以下事件引发异常:Application_EndRequest,有时为Application_BeginRequest。在这两种情况下提出的例外情况是:

“从请求实例的作用域中看不到标记与'AutofacWebRequest'匹配的作用域。这通常表示SingleInstance()组件正在请求根据HTTP请求注册的组件(或类似情况)。”在web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,而不是从容器本身”

我们已经确保对容器对象使用ILifeScope,而不是根容器对象。但是,这并不能修复错误。其他人对我们还需要做什么有什么建议吗

有关详细信息,请调用AutofacBuilder.Configure注册所有必要的库类型和模块,并通过调用Build方法从autofac返回根容器

谢谢

我们正在使用的PS: Visual Studio 2013, MVC5.1
Autofac 3.3

错误消息几乎说明了一切,但更具体地说,出现了以下一种或多种情况:

  • 一个或多个开始/结束请求处理程序正在注册为
    instanceperhtprequest
  • 开始/结束请求处理程序所需的一个或多个依赖项正在注册为
    instanceperhtprequest
  • 一个或多个请求处理程序(或请求处理程序的依赖项)正在应用程序启动/结束期间尝试使用
    DependencyResolver.Current
Autofac依赖项解析器需要web请求上下文才能工作。您可以在以下答案中了解更多信息:

应用程序开始/结束未运行web请求。他们在请求管道之外

检查您的注册(显示在
AutofacBuilder.Configure
)并查看哪些是
instanceperhtprequest
。处理程序执行过程中所需的某些内容以这种方式被错误注册,因此当找不到web请求范围时-boom。及
using(var scope = container.BeginLifetimeScope())
{
   // Resolve from a scope.
   var runAtStartups = scope.Resolve<IEnumerable<IRunAtStartup>>();
   // Do the run, etc.
}