首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >500.19在Webforms中使用Autofac MultiTenancy时出错

500.19在Webforms中使用Autofac MultiTenancy时出错
EN

Stack Overflow用户
提问于 2020-12-12 21:54:45
回答 2查看 38关注 0票数 0

我正在尝试使用Autofac通过依赖注入对现有的多租户WebForms进行现代化改造。

当我尝试浏览到租户目录时,我得到一个500.19错误。

HTTP错误500.19 -内部服务器错误无法访问请求的页面,因为该页面的相关配置数据无效。

配置错误无法添加类型为“add”且唯一键属性“”name“”设置为“”ContainerDisposal“”的重复集合条目

代码语言:javascript
复制
    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" />

这些值绝对不会重复。我可以浏览到租户目录之外的页面,而不会收到错误。

下面是我如何创建多租户容器的方法。

代码语言:javascript
复制
    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

EN

回答 2

Stack Overflow用户

发布于 2020-12-15 00:00:32

我花了大约15分钟试着用你的复制品看看是怎么回事,但是:

  • 自述文件中仅运行EF命令的指令不起作用。web应用程序是定义连接字符串的地方,而数据项目是迁移的地方。即使您通过了...
  • 连接字符串引用三个不同的.mdf文件,这三个文件没有检入,也不会自动创建。

对于将来的问题,我建议提出一个最小的重现。例如,问题不是数据库的问题,所以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.希望它能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2020-12-19 05:08:08

500.19的错误可能是在转移注意力。我的applicationHost.config文件损坏了。我在运行一个已知良好的项目时也遇到了同样的错误。

在Travis的反馈之后,我创建了一个新的,精简的项目,模仿我需要完成的最低限度的事情。

  1. 每个租户都有自己的目录。
  2. 租户页面加载用户控件。
  3. 用户控件显示租户的数据。
  4. 将租户的连接字符串传递给需要它来获取数据的类。

新的示例可以在这里找到https://github.com/TonyaT3PO/WebForms.Autofac.MultiTenant.Minimal

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65265700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档