我正试图在发生异常时将一个操作重定向到另一个操作。此外,我想同时回滚所有的变化。回滚数据是通过抛出一个异常来完成的,但是当我们抛出一个异常时,重定向是不工作的。(我使用的是一个框架(ABP),它可以在抛出异常时自动处理回滚,所以我的代码中没有 "BeginTransaction "和 "Commit "等。)
当代码运行时,它只是回滚数据的变化并显示异常,但没有重定向。
[HttpPost]
public async Task<ActionResult> action1()
{
var exception=false;
try
{
await method1();
return RedirectToAction("Success", "Result");
}
catch (Exception e)
{
exception = true;
return RedirectToAction("ShowError", "Result");
}
finally
{
if (exception == true)
throw new Exception("1000");
}
}
public async Task<ActionResult> method1()
{
// Some changes on database
}
ABP的 常规工作单位 是围绕着您的控制器动作 action1
.
你应该要求一个新的工作单位,在你的范围内。try
块。
[HttpPost]
public async Task<ActionResult> action1()
{
try
{
using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.RequiresNew))
{
await method1();
uow.Complete();
}
return RedirectToAction("Success", "Result");
}
catch (Exception e)
{
return RedirectToAction("ShowError", "Result");
}
}
或者,你可以做 method1
virtual
并标明 UnitOfWork
属性。
[HttpPost]
public async Task<ActionResult> action1()
{
try
{
await method1();
return RedirectToAction("Success", "Result");
}
catch (Exception e)
{
return RedirectToAction("ShowError", "Result");
}
}
[UnitOfWork(TransactionScopeOption.RequiresNew)]
public virtual async Task<ActionResult> method1()
{
// Some changes on database
}
另外,我想在同一时间回滚所有的变化。回滚数据需要抛出异常,而当我们抛出异常时,重定向就无法工作。
你不能让一个方法返回一个结果。和 抛出一个异常;要么是一个,要么是另一个。
你可以做的是抛出一个异常--这将导致回滚--然后在你的动作方法中捕获它并返回一个结果。
[HttpPost]
public async Task<ActionResult> action1()
{
try
{
await method1();
return RedirectToAction("Success", "Result");
}
catch (Exception e)
{
return RedirectToAction("ShowError", "Result");
}
}