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