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/

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....