在Application Start for MVC中动态设置Web.Config

时间:2014-01-09 23:10:15

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我有一个内置于ASP.NET MVC的Web应用程序,将由多个客户端使用。每个客户端都有自己的数据库来存储信息,但每个实例都具有相同的功能。我正在使用此问题/答案How can I host multiple websites in IIS 7 and use the same MVC application for all them?中的提示进行整合,以便于维护。

现在,我将每个客户端设置在自己的文件夹中,每个客户端都有自己的Web.Config文件。有几个appConfig设置以及该客户端独有的connectionStrings。

我想要做的是拥有一个包含MVC项目的app文件夹,但应用程序会动态提取正确的web.config文件夹(存储在另一个文件夹中)。我将选择web.config可能基于主机设置(即www.domain.com加载domain.web.config文件。)

我希望这样更新ConfigurationManagement对象的行为。我已经看过几篇关于如何加载配置文件的帖子(大多数关于桌面应用程序的app.config),但没有看到如何使它成为ASP.NET MVC和web.config的半全局更改或独特特性。

我该如何做到这一点?

2 个答案:

答案 0 :(得分:0)

您要做的事情称为多租户。这是一项非常复杂的任务。

您无法真正使用web.config替换,一个请求提供一个文件,另一个请求提供另一个配置。如果来自不同租户的2个请求恰好同时出现怎么办?

目前我们正在将我们的应用程序转换为多租户,这是一项非常复杂的任务,因此无法在SO的一个答案中真正描述。

您可以看一下这篇文章http://www.scribd.com/doc/140181293/setting-up-an-mvc4-multi-tenant-site-v1-1 此外,如果你谷歌“多租户MVC”你会得到很多文章。

我们的多租户的基本原则如下所示:DI容器知道不同的租户,并且知道tenant1.site.com的请求应该使用配置集1,而对于请求tenant2.site.com应该使用配置集2 。 除DI容器外,没有其他组件了解租户。 DI容器协调配置。连接字符串位于配置对象中,这些对象在创建之前会被赋予EF上下文......有些复杂。

如果您的案例很简单并且您没有使用缓存,要替换连接字符串,我会将它们保存在web.config之外,并根据租户请求提供它们。可能你没有复杂的DI设置就可以逃脱。

答案 1 :(得分:0)

如果您使用外部配置文件来隔离客户独有的连接字符串而使配置文件的大部分保持不变,则维护多个配置文件的开销很小。

<?xml version='1.0' encoding='utf-8'?>
<configuration>
<connectionStrings configSource="connections.config"/>
</configuration>

有关在运行时解析配置信息的更多选项,请参阅 http://msdn.microsoft.com/en-us/library/ms254494(v=vs.110).aspx

有关内部文件中的应用设置,请参阅Moving Settings to another config file

相关问题