2014-06-29 28 views
1

我正在寻找添加一些后台处理到我的ASP.NET MVC 5应用程序,更具体地执行HostingEnvironment.QueueBackgroundWorkItem的一些长期(5-10秒)运行任务。现在,我遇到的问题是代码运行“带外”,并且不再与请求绑定 - Autofac处理一些注入的依赖关系。Autofac和HostingEnvironment.QueueBackgroundWorkItem

下面是一些代码:

 [HttpPost, ActionName("Execute")] 
    public ActionResult ExecutePost(Guid taskguid, FormCollection values) 
    { 
     if (taskguid == default(Guid)) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     var model = _taskListService.GetTaskByGuid(taskguid); 

     if (TryUpdateModel(model.TaskObject as MissingCrossReferenceTask)) 
     { 
      model.TaskObject.DependencyContainer = _dependencyContainer; 
      model.TaskObject.TaskListId = model.Id; 

      HostingEnvironment.QueueBackgroundWorkItem(ct => ExecuteTask(ct, model)); 

      return RedirectToAction("Index", "Dashboard"); 
     } 


     return View(model); 

    } 

在上述DependencyContainer的代码是包含多个依赖性由Autofac注射(EF库和服务)

private void ExecuteTask(CancellationToken ct, TaskList model) 
    { 
     model.TaskObject.Execute(); 
    } 

对象MissingCrossReferenceTask执行方法的内部(它与ASP.NET MVC项目分开组装):

 public bool Execute() 
    { 


     long tableId = DependencyContainer.CrossReferenceService.GetCrossReferenceTable(TableName).Id; 

     string currentValue = DependencyContainer.CrossReferenceService.GetValue(FromValue, tableId); 

     ... 

    } 

第一行抛出一个异常:ObjectDisposedExcetion {“的ObjectContext的实例已经设置,不能再用于需要连接的操作”}

现在,我不知道Autofac不够好找出解决这个问题的最佳方法。是否有可能在ExecuteTask方法中直接重新引用引用?如果是这样 - 如何?

我非常感谢任何帮助。它已被我逼疯了,现在几天...

感谢, 尼克Goloborodko

回答

0

我猜提交的问题迫使我看问题从一个略微不同的角度。

我想我已经找到了一个解决方法(换句话说 - 它现在工作,因为我喜欢它)。我仍然不确定这种方法是否适合我的情况,或者是否有任何看不见的问题 - 我非常感谢关于此主题的任何评论!

我已经解决了这个问题通过以下方式:

private void ExecuteTask(CancellationToken ct, TaskList model) 
    { 
     MvcApplication app = this.HttpContext.ApplicationInstance as MvcApplication; 

     using (var container = app.ContainerProvider.ApplicationContainer.BeginLifetimeScope(WebLifetime.Application)) 
     { 
      model.TaskObject.DependencyContainer = container.Resolve<DependencyContainer>(); 
      model.TaskObject.Execute(); 
     } 
    } 

(从发布此页面上的解决方案通过:http://aboutcode.net/2010/11/01/start-background-tasks-from-mvc-actions-using-autofac.html

但愿这一点时间保存到有人在别人未来!