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();
的问题。抛出一个错误,告知某些数据库操作不完整。这就是为什么我使用 .Result
和 ForEach
方法不是 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.
我假设修复过程是这样的:
ForEach
不适用于 async
,因此我需要使其同步。
- Blocking didn't work,所以我需要使用
Task.Run
来避免死锁。
- 嗯,现在我不明白
HttpContext.Current
。我怎样才能得到HttpContext.Current
?
但更好的解决方法是:
ForEach
不适用于 async
,所以我需要使用 ForEach
以外的东西。
将 ForEach
更改为 foreach
将以更好的方式解决您的问题。
我开发了一个 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();
的问题。抛出一个错误,告知某些数据库操作不完整。这就是为什么我使用 .Result
和 ForEach
方法不是 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 aForEach
method... If I configure theForEach
method asasync
... An error is thrown telling that some database operations are incomplete. That is why I used.Result
and theForEach
method not to be async.
事实上,ForEach
方法没有正确理解 async
lambda,如果你将它的 lambda 设为 async
,那么你最终会得到 async void
lambda, should be avoided. That would cause the "asynchronous operation incomplete" errors.
我假设修复过程是这样的:
ForEach
不适用于async
,因此我需要使其同步。- Blocking didn't work,所以我需要使用
Task.Run
来避免死锁。 - 嗯,现在我不明白
HttpContext.Current
。我怎样才能得到HttpContext.Current
?
但更好的解决方法是:
ForEach
不适用于async
,所以我需要使用ForEach
以外的东西。
将 ForEach
更改为 foreach
将以更好的方式解决您的问题。