当前位置: 首页 > 编程语言 > C#

WebAPI-在DbContext类中访问HttpContext分享

时间:2023-04-11 02:09:08 C#

WebAPI-在DbContext类中访问HttpContext在我的C#WebAPI应用程序中,我在所有表中添加了CreatedDate和CreatedBy列。现在,我想在任何表中添加新记录时填充这些列。为此,我重写了DbContext类中的SaveChanges和SaveChangesAsync函数,如下所示:返回base.SaveChanges();}publicoverrideasyncTaskSaveChangesAsync(){AddTimestamps();返回等待base.SaveChangesAsync();}privatevoidAddTimestamps(){varentities=ChangeTracker.Entries().Where(x=>(x.State==EntityState.Added));varcurrentUsername=!string.IsNullOrEmpty(HttpContext.Current?.User?.Identity?.Name)?HttpContext.Current.User.Identity.Name:"SYSTEM";foreach(实体中的var实体){foreach(entity.CurrentValues.PropertyNames中的varpropName){}elseif(propName=="CreatedDate"&&entity.State==EntityState.Added){entity.CurrentValues[propName]=DateTime.Now;}}}}}现在,当我从控制器中的任何位置调用SaveChanges或SaveChangesAs时async,分配了HttpContext.Current,我可以使用ttpContext.Current.User.Identity.Name从中获取用户名,但是当我使用UserManager.UpdateAsync函数(它在我们的DbContext类中内部调用SaveChangesAsync函数)进行更改时对于底层用户表,HttpContext.Current设置为null。在这种特定情况下,如何访问HttpContext以获取用户名?问题是,对于SaveChangesAsync,您不知道您是否有权访问HttpContext.Current,因为您可能没有在处理请求的线程上执行。解决这个问题的最好方法是使用DI。您可以创建一个接口和匹配类,其中实现依赖于HttpContextBase。配置DI框架以将IUserContext实例注入DbContext并为每个请求创建一个新的UserContext实例。至于使用哪个DI框架,我偏向于Autofac,但有很多可供选择,而且大多数都具有相似的功能。以上就是C#学习教程:WebAPI-在DbContext类中访问HttpContext共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——publicinterfaceIUserContext{boolIsAuthenticated{get;}//其他属性,如用户ID/名称/等}publicclassUserContext:IUserContext{publicUserContext(HttpContextBasehttpContext){//其他任何你想用到的属性}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: