C# Autofac global.asax在MVC 5.1中使用任务时出错
我在global.asax.cs文件中使用应用程序事件设置了一系列任务,如下所示: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;
// 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
AutofacBuilder.Configure
)并查看哪些是instanceperhtprequest
。处理程序执行过程中所需的某些内容以这种方式被错误注册,因此当找不到web请求范围时-boom。及
using(var scope = container.BeginLifetimeScope())
{
// Resolve from a scope.
var runAtStartups = scope.Resolve<IEnumerable<IRunAtStartup>>();
// Do the run, etc.
}