我有Web api应用程序.net Framework 4.6.2,我们将用户凭据存储在令牌中。我重写dbcontext.savechanges来跟踪数据库更改。我想访问存储在令牌中的userId,并且可以在api中通过httpContext访问它。但是HTTP上下文在dbcontext中不可用。
答案 0 :(得分:1)
System.Web.HttpContext.Current
是否获得当前的请求上下文?
我应该指出,尽管将直接引用此内容的东西添加到DbContext
中是很糟糕的设计……您应该使用Dependency Injection并通过某些服务来管理它,并且该服务的生存期仅限于请求-或在至少那是我要做的...
答案 1 :(得分:0)
正如@GPW所说,这是一个糟糕的设计决定。 要解决这种情况,您需要使用IoC进行注册,例如:
// Autofac
builder.Register(c => new HttpContextWrapper(HttpContext.Current))
.As<HttpContextBase>()
.InstancePerRequest();
// Again Autofac
builder.RegisterModule(new AutofacWebTypesModule());
// Castle Windsor
container.Register(Component.For<HttpContextBase()
.LifeStyle.PerWebRequest
.UsingFactoryMethod(() => new HttpContextWrapper(HttpContext.Current)));
使用控制器进行喷射的控制器:
public class HomeController : Controller
{
private readonly HttpContextBase _httpContext;
public HomeController(HttpContextBase httpContext)
{
_httpContext = httpContext;
}
}
因此您注入HttpContextBase
以便访问上下文
public class EntitiesContext : DbContext
{
private readonly HttpContextBase _httpContext;
public EntitiesContext(HttpContextBase httpContext)
{
_httpContext = httpContext;
}
}