依赖解析失败,在 ActionResult 中运行任务

马瑟

我需要与其他代码并行运行大量代码,以便用户不必等待..我正在尝试Task.Run(() =>完成我的任务。我的任务是使用依赖注入从服务调用方法。
我收到以下错误:

{"依赖项解析失败,类型 = \"Company.CacheProvider.CacheEmployeeProvider\", name = \"(none)\"。\r\n异常发生在:解析时。\r\n异常是:InvalidOperationException - The PerRequestLifetimeManager只能在 HTTP 请求的上下文中使用。此错误的可能原因是在非 ASP.NET 应用程序上使用生命周期管理器,或者在与适当的同步上下文不相关的线程中使用它。\r\ n-----------------------------------------------\r \n发生异常时,容器为:\r\n\r\n 正在解析 Company.Provider.CacheProvider.CacheEmployeeProvider,(none)\r\n 正在解析构造函数 Company.Provider.CacheProvider 的参数 \"cache\" .CacheEmployeeProvider(Company.Provider.Interface.IEmployeeProvider provider, Company.Provider.Interface.ICache 缓存)\r\n 解析 Company.Provider.CacheProvider.RequestCache,(none)(从 Company.Provider.Interface.ICache 映射,(none))\r\n"}

错误提供了可能的原因.. 但我找不到解决方案..

整个应用程序正在使用PerRequestLifetimeManager.. 我怎样才能在可能的任务中使用它.. 或者我怎样才能让我的任务在不同的上下文中运行而没有任何问题..

更新: - 注册

 var container = new UnityContainer();   

 container.RegisterType<IEmployeeProvider>(new InjectionFactory(unity => unity.Resolve<CacheEmployeeProvider>(new DependencyOverride(typeof(IEmployeeProvider), unity.Resolve<DbEmployeeProvider>()))));       
 container.RegisterType<IEmployeeService, EmployeeService>();

 DependencyResolver.SetResolver(new UnityDependencyResolver(container));
 DynamicModuleUtility.RegisterModule(typeof(Microsoft.Practices.Unity.Mvc.UnityPerRequestHttpModule));

这是基本代码 EmployeeController

依赖

[Microsoft.Practices.Unity.Dependency]
public Lazy<IEmployeeService> EmployeeService { get; set; }

发布请求

[HttpPost]
public ActionResult AddEmployee(EmployeeModel model)
{
   var employee = EmployeeService.Value.Add(model);

   Task.Run(() => SetupEmployeeArea(employee.Id)); //task to setup employee related data

   return RedirectToAction("EmployeeList"); //redirect user to the list of employees
}

任务

async Task SetupEmployeeArea(int id)
{
   EmployeeService.Value.EmployeeSetup(id); //this call firing exception
}

我也尝试过,但是这段代码没有完全执行......在调试时我丢失了中间的指针,什么也没发生。

async Task SetupEmployeeArea(int id)
{
   var employeeService = DependencyResolver.Current.GetService<IEmployeeService>();
   employeeService.EmployeeSetup(id); //not getting any exception and code is also not running
}

请分享建议......或者如果可能的话,也请分享最好的替代方案来满足我的要求(并行运行大量代码),除了“Hangfire”......我已经有太多的负载了:)

阿雷克齐拉

问题是 http 上下文在任务完成之前关闭。尝试使控制器的方法异步并运行如下任务:

await Task.Run(() => SetupEmployeeArea(employee.Id)); //task to setup employee related data

然后任务在 http 上下文关闭之前完成。

如果您想在任务完成之前返回结果,请考虑使用一些后台工作程序,例如 QueueBackgroundWorkItem https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule- and-run-background-processes-in-asp-net/或一些外部框架(如 Hangfire)并注册您的依赖项以在 http 上下文之外解析。

如果不需要在 http 上下文中解析某些服务,请将其范围更改为另一个,例如瞬态或单例https://msdn.microsoft.com/en-us/library/ff647854.aspx您始终可以创建自定义生命周期管理器来处理 http 上下文关闭的情况,如下所示:https : //stackoverflow.com/a/4698138/9502162

另一种方法是加载页面,然后使用 ajax 调用执行此任务,以便用户立即看到该页面。但是通过这种方法,您可以让客户端应用程序负责设置可能不需要的员工相关数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ActionResult 中的参数

Maven和Ivy依赖项解析在Gradle 6.0中失败

运行ActionResult时模型值为null

运行依赖 sbt 任务

Ansible:运行失败的任务

参数未传递到ActionResult中

无法断言在Xunit中返回jsonresult的ActionResult

运行构建任务/ tsc中的VSCode路径生成失败:构建

如果 Jenkins 中的测试失败,如何运行任务

如果下游任务在气流中失败,如何重新运行上游任务(使用Sub Dags)

如何检查任务1是否失败然后在气流中运行任务2?

重复检查失败,我该如何返回ActionResult

在一个ActionResult中两次运行.ExecuteStoreCommand时出错“参数已使用”

如何检查任务是否作为gulp @ 4中另一个任务的依赖项运行?

将 View 中的 ActionLink 链接到 Controller 中的 ActionResult

生成依赖项片段文件任务失败

任务':app:prepareDebugAndroidTestDependencies'依赖错误的执行失败

从插入符中运行gbm时出错:{:任务1中的错误失败-“输入必须是因素”

在SBT中添加HornetQ依赖项会导致hornetq-native的解析失败。$ {native-package-type}

如何修复 NET Core 中不工作的 ActionResult 更新?

如何从不是从Controller派生的类中返回ActionResult(文件)?

尝试在ActionResult中返回HTML会导致HTTP 406错误

参数在 ActionResult 中没有给出正确的值

HTML RenderAction-ActionResult方法中的重定向

使用 ActionResult 时在中间件中设置响应头

如何在服务中调用 Async Task<ActionResult> 方法?

因为analyzer >=2.0.0 依赖于meta ^1.7.0 ...(因为myP 依赖于sdk 和analyzer 2.0.0 中的flutter_test any,版本解析失败)

Rust中失败的任务

如何在gradle jar任务生成的jar中包括运行时依赖项