基于控制器的Audit.Net定位cosmos容器

问题描述

我正在使用 Audit.Net 来记录我的应用程序中的所有控制器操作,它是一个很棒的库。

我正在使用 Azure Cosmos DB 审核所有事件。我正在使用以下设置连接 Cosmos DB:

Configuration.Setup()
      .UseAzureCosmos(config => config
      .Endpoint(configuration["AuditSettings:ConnectionString"])
      .AuthKey(configuration["AuditSettings:AuthKey"])
      .Database(configuration["AuditSettings:Database"])
      .Container(configuration["AuditSettings:Container"])
      .ConnectionPolicy(new ConnectionPolicy
      {
        ConnectionMode = ConnectionMode.Direct,ConnectionProtocol = Protocol.Tcp
      }));

目前所有事件信息都进入一个容器,但现在我想为不同的控制器使用不同的容器。例如:对于 UserController 操作,我想在 Cosmos DB 中使用 UserContainer,而对于 EmployeeController,我想使用 EmployeeContainer。

我应该能够为我使用的每个控制器设置容器,计划使用控制器类上的属性来指定应该使用哪个容器来存储审计事件信息。

我无法弄清楚如何在控制器上下文或上下文过滤器中访问配置。我可以从控制器实例获取 CurrentAuditScope,但不确定如何访问配置器,以便在写入 Cosmos DB 之前动态设置容器。

任何想法将不胜感激。

解决方法

可能会为 Azure Cosmos 数据提供程序请求更改 here,以允许使用将 using Audit.WebApi; Audit.Core.Configuration.Setup() .UseAzureCosmos(_ => _ .Endpoint("...") .AuthKey("...") .Database("...") .Container(auditEvent => { return auditEvent.GetWebApiAuditAction().ControllerName; }) 作为参数的委托函数构建容器名称。

类似于其他数据提供程序,如 SQL Server 数据提供程序。

所以你可以这样设置:

HttpContext

与此同时,我认为一种解决方法是直接从当前的 public void Configure(IApplicationBuilder app,IHttpContextAccessor contextAccessor) { Audit.Core.Configuration.Setup() .UseAzureCosmos(_ => _ .Endpoint("...") .AuthKey("...") .Database("...") .Container(() => { var action = contextAccessor.HttpContext.Items["__private_AuditApiAction__"] as AuditApiAction; return action.ControllerName; }) ... } 获取审计事件,例如假设 asp.net 核心:

.buttonStyle(BorderlessButtonStyle())

魔法字符串来自here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...