微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐