Asp.net mvc 3 Autofac MultiTenant-如何路由到子域?

Asp.net mvc 3 Autofac MultiTenant-如何路由到子域?,asp.net-mvc-3,autofac,Asp.net Mvc 3,Autofac,这里是n00b。你问这个问题是因为我没有给它贴上正确的标签 我试图利用Autofac的互写功能。我从源文件中得到了一个“工作”示例。我已经扫描了文件,很难弄清楚如何“路由”租户 目前,我想为一个基本的CRUD应用程序使用一个代码库。CRUD应用程序将被多个不同的站点使用,只专注于单个站点的特定服务 我希望最终做到这一点: codebase.website1.com(租户1) codebase.website2.com(租户2) codebase.website3.com(租户3) 有什么想法

这里是n00b。你问这个问题是因为我没有给它贴上正确的标签

我试图利用Autofac的互写功能。我从源文件中得到了一个“工作”示例。我已经扫描了文件,很难弄清楚如何“路由”租户

目前,我想为一个基本的CRUD应用程序使用一个代码库。CRUD应用程序将被多个不同的站点使用,只专注于单个站点的特定服务

我希望最终做到这一点:

  • codebase.website1.com(租户1)
  • codebase.website2.com(租户2)
  • codebase.website3.com(租户3)
有什么想法或参考资料吗?谢谢。

如果您退房,您会注意到您确定租户的方式是通过实施
ITenantIdentificationStrategy
。wiki页面上给出了一个示例,展示了如何从请求中的参数(如查询字符串)获取租户

修改示例以查看请求的其他部分很容易——主机名、域名或其他任何内容

using System;
using System.Web;
using AutofacContrib.Multitenant;

namespace DemoNamespace
{
  public class DomainStrategy : ITenantIdentificationStrategy
  {
    public bool TryIdentifyTenant(out object tenantId)
    {
      tenantId = null;
      try
      {
        var context = HttpContext.Current;
        if(context != null && context.Request != null)
        {
          var site = context.Request.Url.Authority;
          // Here's where you map the site to the tenant ID:
          tenantId = MapTheSiteToTheTenantId(site);
        }
      }
      catch(HttpException)
      {
        // Happens at app startup in IIS 7.0
      }
      return tenantId != null;
    }
  }
}
显然,你需要按摩来为你工作。如何进行映射,是否返回null作为默认租户ID,等等

请注意,如果您是基于HTTP请求值进行测试,那么在解决依赖项且没有web上下文时,您将获得应用程序级依赖项,而不是特定于租户的依赖项。。。因为你无法识别房客。您可以在catch块中看到一个小工件-如果在应用程序启动时解决了任何依赖项,则不一定存在web上下文,因此当您调用HttpContext.Current时,IIS 7.0会抛出一个HttpException。你必须测试类似的东西

也要考虑租户ID映射的缓存策略,如果是服务调用或昂贵的东西。每次解析多租户依赖关系时,都会调用该策略,因此您希望使策略实现尽可能高效

它很长,但这是因为多租户是一个复杂的话题,有很多地方需要覆盖。如果你深入其中,你会找到这样问题的答案。

如果你去查看,你会注意到确定租户的方法是通过实施
itenantIdentificationsStrategy
。wiki页面上给出了一个示例,展示了如何从请求中的参数(如查询字符串)获取租户

修改示例以查看请求的其他部分很容易——主机名、域名或其他任何内容

using System;
using System.Web;
using AutofacContrib.Multitenant;

namespace DemoNamespace
{
  public class DomainStrategy : ITenantIdentificationStrategy
  {
    public bool TryIdentifyTenant(out object tenantId)
    {
      tenantId = null;
      try
      {
        var context = HttpContext.Current;
        if(context != null && context.Request != null)
        {
          var site = context.Request.Url.Authority;
          // Here's where you map the site to the tenant ID:
          tenantId = MapTheSiteToTheTenantId(site);
        }
      }
      catch(HttpException)
      {
        // Happens at app startup in IIS 7.0
      }
      return tenantId != null;
    }
  }
}
显然,你需要按摩来为你工作。如何进行映射,是否返回null作为默认租户ID,等等

请注意,如果您是基于HTTP请求值进行测试,那么在解决依赖项且没有web上下文时,您将获得应用程序级依赖项,而不是特定于租户的依赖项。。。因为你无法识别房客。您可以在catch块中看到一个小工件-如果在应用程序启动时解决了任何依赖项,则不一定存在web上下文,因此当您调用HttpContext.Current时,IIS 7.0会抛出一个HttpException。你必须测试类似的东西

也要考虑租户ID映射的缓存策略,如果是服务调用或昂贵的东西。每次解析多租户依赖关系时,都会调用该策略,因此您希望使策略实现尽可能高效


它很长,但这是因为多租户是一个复杂的话题,有很多地方需要覆盖。如果你深入其中,你会找到这样的问题的答案。

这个底层CRUD应用程序会是一个单独的运行实例,在不同站点的代码中调用吗?如果是这样,它的架构将是什么?@MarcL。我在想IIS 7.0,赢得2008 R2。是的,单个实例将由网站1、2或3调用。因此,在网站1上,将有一个指向codebase.website1.com等的链接。但是,每个用户都将基于该网站进行身份验证,因此网站2上的用户2无法登录到codebase.website1.com。我希望这是有意义的。这个底层CRUD应用程序是否会是一个单独的运行实例,从不同站点的代码中调用?如果是这样,它的架构将是什么?@MarcL。我在想IIS 7.0,赢得2008 R2。是的,单个实例将由网站1、2或3调用。因此,在网站1上,将有一个指向codebase.website1.com等的链接。但是,每个用户都将基于该网站进行身份验证,因此网站2上的用户2无法登录到codebase.website1.com。我希望这是有意义的。我特别关注的是这段代码,以及我想知道如何实现这一策略的地方(wiki特别指出“仅示例,不推荐使用”)。虽然我看到你在
if
块中添加了代码。我在这方面是n00b。你推荐这样一种基于域名的策略吗?感谢你的见解。是的,我现在开始明白了。:)不推荐的一点是使用querystring参数来切换租户。这样做只会让人改变他们的查询和“成为”一个不同的租户。使用主机/域名是不同的,因为你不能在同一个“网站”上乱搞“-就浏览器而言,您实际上要去其他地方。关键是,请仔细考虑您选择的租户ID机制。有人能用它作为攻击向量吗?他们不能对主机名做太多的处理,但是querystring我可以,比方说,基于一个简单的querystring更改,让一个表单注入不同的验证依赖项(在同一个站点上)。我只是想弄清楚如何使用主机/域(这里是n00b)。我的问题