【发布时间】:2015-04-13 17:30:44
【问题描述】:
我试图做的是实例化UserContext(理想情况下每个用户只有一个实例)。 UserContext 取决于当前登录的用户。
MyUser 是通过调用GlobalContext.User(username) 创建的
下面的sn-p是从我的Startup.Configuration(IAppBuilder app)调用的:
private static IContainer RegisterServices()
{
var builder = new ContainerBuilder();
builder.RegisterApiControllers(System.Reflection.Assembly.GetAssembly(typeof(MyWeb.API.Startup)));
builder.RegisterType<GlobalContext>().As<IGlobalContext>().SingleInstance();
builder.Register(c => c.Resolve<IGlobalContext>().User(
HttpContext.Current.User.Identity.Name)
).As<MyUser>();
builder.RegisterType<UserContext>().As<IUserContext>().InstancePerLifetimeScope();
return builder.Build();
}
在 IIS Express 中运行时似乎一切正常。
当我使用 Owin 在集成测试中运行时,WebApp.Start<Startup>(url: BaseAddress)HttpContext.Current 为空。这是我迄今为止所做的所有阅读所预期的,但有什么替代方法?
我认为我需要访问 owinContext 或 autofac 生命周期范围以在解析期间获取当前用户,但我该怎么做?
有没有更好的方法来做到这一点?还是我错过了一些琐碎的事情?
感谢所有帮助。
编辑添加信息:
如果有帮助,我会在此处包含我的 Configuration() 方法:
using System.Web;
using System.Web.Http;
using Autofac;
using Autofac.Integration.WebApi;
using Owin;
using System.Reflection;
namespace SomeNameSpace
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var configuration = new HttpConfiguration{ IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always };
WebApiConfig.Register(configuration);
BreezeConfig.Register(configuration);
CorsConfig.Register(configuration);
// Autofac IoC
var container = RegisterServices();
app.UseAutofacMiddleware(container);
app.UseWindowsAuthentication();
var urt = new UserRolesTranformer(new GlobalContext());
app.UseClaimsTranformation(urt.Transformation);
app.UseAutofacWebApi(configuration);
configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
//app.Use(typeof(TestMiddleware));
app.UseAutofacWebApi(configuration);
app.UseWebApi(configuration);
}
}
最终目标: 创建一个模拟多个并发用户登录的测试,并确保每个用户都有自己的 UserContext 实例。
【问题讨论】:
标签: c# asp.net-web-api2 autofac owin