我正在使用Autofac进行Inversion of Control容器,其配置如下
public void Configuration(IAppBuilder app) { configureIoC(app); configureAuth(app); } void configureIoC(IAppBuilder app) { var b = new ContainerBuilder(); //... b.Register(c => HttpContext.Current?.User?.Identity ?? new NullIdentity()).InstancePerLifetimeScope(); var container = b.Build(); app.UseAutofacMiddleware(container); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); }
我相信这是Autofac与其他容器的事实可能与我所看到的无关.在这里,他们重点线是一个配置上的任何依赖IIdentity
从采摘HttpContext.Current
.
我这样使用它,这样我就可以随时随地访问当前用户.
public interface ICurrentUser { TaskGet(); } public class CurrentUserProvider : ICurrentUser { public async Task Get() => await users.FindByNameAsync(currentLogin.GetUserId()); public CurrentUserProvider(AppUserManager users, IIdentity currentLogin) { this.users = users; this.currentLogin = currentLogin; } }
我在过去的项目中使用了这种模式,它运行良好.我正在将它应用于现有项目并看到一个非常奇怪的事情.
当一个Asp.net Mvc控制器依赖于ICurrentUser
一切正常
当的WebAPI控制器获取实例ICurrentUser
的Get
,因为实例操作失败,IIdentity
尚未从cookie解析,还没有装进去索赔(AuthenticationType == null
)!奇怪的是,如果我在实例化WebApi控制器后暂停调试器,我可以HttpContext.Current.User.Identity
看到AuthenticationType == "Cookie"
并且所有声明都存在.
这导致我得出的结论是,某些事情按以下顺序发生
如果这是web api路由,则Web Api控制器会创建一个实例
Asp.Net Identity填写当前HttpContext
身份
如果这是一个mvc路由,则mvc控制器会创建一个实例
执行任何操作
这当然毫无意义!
所以问题如下
我对管道中事物顺序的推断是否正确?
如何控制它才能正常工作?为什么这会对其他项目起作用,但会在这里造成问题?我是否以错误的顺序连接了什么?
请不要建议我创建一个IdentityProvider
迟到的解决方案IIdentity
.我理解如何解决这个问题,我不明白为什么会发生这种情况以及如何控制事物的管道顺序.