System.Web.HttpContext.Current迷路

System.Web.HttpContext.Current get lost

我开发了一个 MVC 5 应用程序。

在控制器内部,我有这个动作:

    // POST: Usuario/Edit
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<JsonResult> Edit(UsuarioViewModel model)
    {
        //
        // some tasks
        //
        //
        return Json("Some text", JsonRequestBehavior.AllowGet);
    }

在 html 表单提交后调用该操作时,System.Web.HttpContext.Current 不为空。我在代码中的某处使用该对象。

现在,我需要从同一控制器中的其他操作方法调用相同的操作方法。在这种情况下,System.Web.HttpContext.Current 为 null,显然会导致应用程序抛出空对象异常。

动作方法和调用为:

    // POST: Usuario/CreateFromStaff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<JsonResult> CreateFromStaff(int[] trabajadores)
    {
        //
        // some tasks
        //
        //
        UsuarioViewModel model = new UsuarioViewModel();
        //
        // model properties assignments
        //
        //
        JsonResult json = Task.Run(async () => await Edit(model)).Result;  // When this call is made, the Http context get lost.
    }

我该怎么做才能保留 http 上下文?或者,我该如何调用?

问题编辑:

只是为了更清楚。 Edit 操作方法是存储记录的标准方式,在本例中为用户记录。在此操作方法中的某个时刻,我有:

await db.SaveChangesAsync();

另一方面,JsonResult json = Task.Run(async () => await Edit(model)).Result;ForEach 方法中。在该循环之后,我需要保存其他数据,以便在它之后使用另一个 await db.SaveChangesAsync();

如果我将 ForEach 方法配置为 async,我总是遇到第二个 await db.SaveChangesAsync(); 的问题。抛出一个错误,告知某些数据库操作不完整。这就是为什么我使用 .ResultForEach 方法不是 async.

谢谢 海梅

What can I do so that the http context is kept? or, how can I do that call?

删除 Task.Run 调用。你应该 strongly avoid ever using Task.Run on ASP.NET.

the JsonResult json = Task.Run(async () => await Edit(model)).Result; is inside a ForEach method... If I configure the ForEach method as async... An error is thrown telling that some database operations are incomplete. That is why I used .Result and the ForEach method not to be async.

事实上,ForEach 方法没有正确理解 async lambda,如果你将它的 lambda 设为 async,那么你最终会得到 async void lambda, should be avoided. That would cause the "asynchronous operation incomplete" errors.

我假设修复过程是这样的:

  1. ForEach 不适用于 async,因此我需要使其同步。
  2. Blocking didn't work,所以我需要使用Task.Run来避免死锁。
  3. 嗯,现在我不明白 HttpContext.Current。我怎样才能得到HttpContext.Current

但更好的解决方法是:

  1. ForEach 不适用于 async,所以我需要使用 ForEach 以外的东西。

ForEach 更改为 foreach 将以更好的方式解决您的问题。