gpt4 book ai didi

c# - Web API - 在 DbContext 类中访问 HttpContext

转载 作者:太空狗 更新时间:2023-10-30 01:13:33 25 4
gpt4 key购买 nike

在我的 C# Web API 应用程序中,我在所有表中添加了 CreatedDateCreatedBy 列。现在我想在任何表中添加新记录时填充这些列。

为此,我重写了 DbContext 类中的 SaveChangesSaveChangesAsync 函数,如下所示:

public class AuthDbContext : IdentityDbContext<ApplicationUser, CustomRole, int, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
public override int SaveChanges()
{
AddTimestamps();
return base.SaveChanges();
}

public override async Task<int> SaveChangesAsync()
{
AddTimestamps();
return await base.SaveChangesAsync();
}

private void AddTimestamps()
{
var entities = ChangeTracker.Entries().Where(x => (x.State == EntityState.Added));

var currentUsername = !string.IsNullOrEmpty(HttpContext.Current?.User?.Identity?.Name)
? HttpContext.Current.User.Identity.Name
: "SYSTEM";

foreach (var entity in entities)
{
foreach (var propName in entity.CurrentValues.PropertyNames)
{
if (propName == "CreatedBy" && entity.State == EntityState.Added)
{
entity.CurrentValues[propName] = currentUsername;
}
else if (propName == "CreatedDate" && entity.State == EntityState.Added)
{
entity.CurrentValues[propName] = DateTime.Now;
}
}
}
}
}

现在,当我从 Controller 中的任何位置调用 SaveChangesSaveChangesAsync 时,HttpContext.Current 已分配,我可以从中获取用户名它通过使用 ttpContext.Current.User.Identity.Name。但是,当我使用 UserManager.UpdateAsync 函数(在我们的 DbContext 类中内部调用 SaveChangesAsync 函数)来更改基础用户表时,HttpContext.Current 设置为空。

在这种特殊情况下如何访问 HttpContext 以获取用户名?

最佳答案

问题是,对于 SaveChangesAsync,您不知道是否可以访问 HttpContext.Current,因为您可能不会在发出请求的线程上执行被送达。

解决这个问题的最好方法是使用 DI。您可以创建一个接口(interface)和匹配类,其中实现依赖于 HttpContextBase。配置 DI 框架以将 IUserContext 实例注入(inject)您的 DbContext 并根据请求创建一个新的 UserContext 实例。

至于使用哪个 DI 框架,我偏向 Autofac但是有很多可供选择,而且大多数都具有相似的功能。

public interface IUserContext {
bool IsAuthenticated {get;}
// additional properties like user id / name / etc
}

public class UserContext : IUserContext
{
public UserContext(HttpContextBase httpContext) {
this.IsAuthenticated = httpContext.User.Identity.IsAuthenticated;
// any other properties that you want to use later
}
}

关于c# - Web API - 在 DbContext 类中访问 HttpContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49557475/

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