asp.net-core – 从Controller传递信息到中间件

我在我的asp.net核心应用程序中设置了一个中间件,以自动将控制器操作包装在一个事务中.

public async Task Invoke(HttpContext context, MyDataContext dbContext)
{
    if (context.Request.Method == "GET")
    {
        await _next(context);
    }
    else
    {
        using (var transaction = await dbContext.Database.BeginTransactionAsync())
        {
            try
            {
                await _next(context);
                transaction.Commit();
            }
            catch (Exception)
            {
                transaction.Rollback();
                throw;
            }
        }
    }
}

但是我有一个不应该在事务中运行的控制器方法(将来可能更多).让控制器操作“选择退出”中间件功能的最佳方法是什么?

将[NoTransaction]等自定义属性放在控制器方法上会很不错.但是,我无法确定是否有任何方法可以从我的中间件的Invoke()方法中确定将调用哪个控制器操作(这将使我能够从该方法中提取属性并确定是否创建事务.)这样做的正确方法是什么?

最佳答案 我认为您正在寻找的是自定义过滤器.

您可以创建一个派生自ActionFilterAttribute的新类.
然后,您可以覆盖OnActionExecuting和OnActionExecuted方法以添加事务处理.

然后,您可以将过滤器属性添加到要运行它们的方法中. [CustomFilter],以防您将类命名为“CustomFilterAttribute”.

如果需要更多地控制过滤器类的生命周期,可以将ActionFilter用作ServiceFilter.它需要将其注册为服务,并允许您使用依赖注入.
ServiceFilter属性看起来略有不同:

[ServiceFilter(typeof(CustomFilter))]

对此的一个很好的参考是:
https://damienbod.com/2015/09/15/asp-net-5-action-filters/

点赞