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

Audit.Net targeting cosmos container based on the controller

我正在使用 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。

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

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

任何想法将不胜感激。

可以请求更改 here Azure Cosmos 数据提供程序,以允许使用将 AuditEvent 作为参数的委托函数构建容器名称。

类似于其他数据提供者,例如 SQL 服务器数据提供者。

所以你可以这样设置:

using Audit.WebApi;

Audit.Core.Configuration.Setup()
    .UseAzureCosmos(_ => _
        .Endpoint("...")
        .AuthKey("...")
        .Database("...")
        .Container(auditEvent =>
        {
            return auditEvent.GetWebApiAuditAction().ControllerName;
        })

与此同时,我认为一种解决方法是直接从当前 HttpContext 获取审计事件,例如假设 asp.net 核心:

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

魔法字符串来自here