我正在尝试使用Autofac通过依赖注入对现有的多租户WebForms进行现代化改造。
当我尝试浏览到租户目录时,我得到一个500.19错误。
HTTP错误500.19 -内部服务器错误无法访问请求的页面,因为该页面的相关配置数据无效。
配置错误无法添加类型为“add”且唯一键属性“”name“”设置为“”ContainerDisposal“”的重复集合条目
Config Source:
60: <modules>
61: <add name="ContainerDisposal" type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web" preCondition="managedHandler" />
62: <add name="PropertyInjection" type="Autofac.Integration.Web.Forms.PropertyInjectionModule, Autofac.Integration.Web" preCondition="managedHandler" />这些值绝对不会重复。我可以浏览到租户目录之外的页面,而不会收到错误。
下面是我如何创建多租户容器的方法。
var context = new TenantDbContext();
var tenantRepository = new TenantRepository(context);
var tenantService = new TenantService(tenantRepository);
var tenants = tenantService.List();
var builder = new ContainerBuilder();
var tenantIdStrategy = new TenantIdentificationStrategy();
builder.RegisterType<TenantDbContext>().InstancePerLifetimeScope();
builder.RegisterType<TenantRepository>().As<ITenantRepository>().SingleInstance();
builder.RegisterInstance(tenantIdStrategy).As<ITenantIdentificationStrategy>();
var multitenantContainer = new MultitenantContainer(tenantIdStrategy, builder.Build());
foreach (var tenant in tenants)
{
var connectionString = tenant.Provider;
multitenantContainer.ConfigureTenant(tenant.Name, b =>
{
b.Register(appContext => new AppDbContext(connectionString))
.InstancePerTenant()
.AsSelf();
b.RegisterType<CourseRepository>()
.As<ICourseRepository>();
});
}
_containerProvider = new ContainerProvider(multitenantContainer);示例应用程序可以在以下位置找到:https://github.com/TonyaT3PO/WebForms.AutoFac.MultiTenant
发布于 2020-12-15 00:00:32
我花了大约15分钟试着用你的复制品看看是怎么回事,但是:
对于将来的问题,我建议提出一个最小的重现。例如,问题不是数据库的问题,所以repro不需要EF或数据库或任何东西。问题与捆绑包、DTO或存储库或其他任何东西无关,所以所有这些都可以解决。There's a great article over here关于创建一个最小的可重现的例子。
一个最小的repro可以帮助人们回答你的问题。就像,如果我不能让你的repro运行,因为它太复杂了,我通常会退出,就是不回答。如果我能让它运行起来-或者,更好的是,如果repro足够小,可以放在问题的这里-那么我更有可能尝试帮助解决这个问题。
一个最小的例子也可以帮助你。我自己做的-一个接一个地移除移动的碎片,直到东西按预期开始工作,然后添加回来,直到它再次坏掉。你会知道哪个东西被添加了,它开始崩溃了,这就是你需要修复或询问的部分。
其间:
我同意你不会两次定义ContainerDisposal。然而,,这就是为什么你可以在你的web应用程序的根目录中定义一个,并在一个子文件夹中定义一个重写。
知道这一点很重要,因为可能发生的情况是,服务器或机器级别的web.config可能已经为您定义了ContainerDisposal,在这种情况下,它不会在应用程序级别的web.config中定义两次,但一旦应用继承,它就会定义两次。
继承的东西不是我们可以从repro中调试的东西-它将是你运行应用程序并看到问题的机器上的东西。
如果我可以运行你的复制品,我就可以验证我是否也看到了它;但既然我看不到,我就不得不留给你一个“读者练习”来检查它。This blog article appears old, but it's still valid for web.config inheritance info.希望它能有所帮助。
发布于 2020-12-19 05:08:08
500.19的错误可能是在转移注意力。我的applicationHost.config文件损坏了。我在运行一个已知良好的项目时也遇到了同样的错误。
在Travis的反馈之后,我创建了一个新的,精简的项目,模仿我需要完成的最低限度的事情。
新的示例可以在这里找到https://github.com/TonyaT3PO/WebForms.Autofac.MultiTenant.Minimal
https://stackoverflow.com/questions/65265700
复制相似问题