gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:27:04 24 4
gpt4 key购买 nike

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

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;
}
}
}
}

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

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

最佳答案

我认为您正在寻找的是自定义过滤器。

您可以创建一个派生自 ActionFilterAttribute 的新类。
然后你可以重写 OnActionExecuting 和 OnActionExecuted 方法来添加你的事务处理。

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

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

[ServiceFilter(typeof(CustomFilter))]

一个很好的引用是:
https://damienbod.com/2015/09/15/asp-net-5-action-filters/

关于asp.net-core - 将信息从 Controller 传递到中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40620058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com