4

我已经搜索了示例并找到了几个,但它们是整个大型项目。我正在寻找一些关于如何开始构建 MVC 多租户应用程序的示例。我认为,第一部分是破译网址。

在 ASP.Net 中,我就是这样做的。我通过查看 DNN 代码得到了这个。我将如何在 MVC 中做同样的事情?

全球.asax

private void Application_BeginRequest(Object source, EventArgs e)
{
  HttpApplication application = (HttpApplication)source;
  HttpContext context = application.Context;

  string domainName = string.Empty;
  // domaName now contains 'example' if application.Request was www.example.com
  domainName = GetDomainName(application.Request);

  // Using domain, get the info for example from the database
  object myPortal = // get from database
  // Save in context for use on other pages
  context.Items.Add("PortalSettings", myPortal);
}

然后在我的基本页面中,我从上下文中获取值。

4

2 回答 2

4

我认为更强大的方法是定义自定义路线。在该自定义路由中,您可以提取域并将其放入路由值中。

然后,您可以拥有定义域属性等的基本控制器(如 Josh 所述),并将该值存储在那里以方便起见(或者只是按需提取它;无论哪种方式)。

通过像这样预先将其拉入路由值,您可以在应用程序中沿着请求路径的任何位置使用该信息,而不仅仅是在控制器中,因此您可以通过这种方式获得更多的重用。例如,您可以在自定义的类似授权的过滤器中使用它来处理用户对该域的权限,等等。

于 2010-02-19T19:21:06.420 回答
2
  1. 获取域名。您使用 DNN 代码走在正确的轨道上。只需在调试器中查看 Request 静态变量;那里有各种很酷的东西。
  2. 您可能需要一个用户商店。我使用自定义数据库,但您可以使用 Microsoft 会员提供程序和配置文件提供程序。使域成为用户的财产,或组织的财产,组织成为用户的财产。
  3. 将用户的域存储在 cookie 中,加密。在请求开始时读取 cookie,并使用户有权访问该组织/域。
  4. 制作一个扩展 Controller 的 BaseController,然后让所有控制器都继承自它。在 BaseController 中,覆盖 OnActionExecuting。这是一个比 Global.asax.cs 的 Begin_request 更容易进行初始请求绑定的地方,因为您可以定义每个控制器都可用的受保护成员。
于 2010-02-19T17:52:18.493 回答