根据URL处理多个web.configs

时间:2017-03-20 23:10:56

标签: asp.net

我们目前有一个用于多个区域数据库的应用程序。代码库完全相同,但是它在网络服务器上推出了3个不同的目录,每个目录都有自己的web.config(点击正确的数据库并获得正确的应用程序设置)。每个都有自己的IIS环境。

但是,我的经理希望这个改变,即一个IIS应用程序,它将为每个区域动态加载正确的web.config文件。

登录时我会尝试根据查询参数加载正确的web.config文件,但我不知道如何在登录时加载web.config文件。

任何有这方面经验的人都有更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

根据您的评论,这是一种不同的方法。你还有一点工作要做。

将所有域路由到同一网站

我假设您每个地区都有一个域名(例如Region1.WebSite.comRegion2.WebSite.com等)。由于需要SSL证书,将这些域名合并到一个物理网站上有点棘手。必须匹配。

两个选项:

  1. 通过三个不同的内部IP地址将所有三个域驱动到同一个Web服务器。这意味着IIS中有三组绑定和三种不同的证书。

  2. 使用SSL offloading并在负载均衡器处终止SSL。将所有三个站点指向IIS上的相同内部IP地址。确保已将LB配置为转发原始主机标头。

  3. 检测请求来自哪里

    在ASP.NET代码中,您可以use the host header查看请求提交的域名,例如

        var siteRequested = Request.Headers["Host"];
    

    使用主机标头选择连接字符串

    在web.config中需要多个条目,每个连接字符串一个。格式化连接字符串的名称以包含主机名,以便您可以使用以下内容获取正确的字符串:

    var configItemName = "ConnectionString." + Request.Headers["Host"];
    var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings[configItemName].ConnectionString;
    

    您的web.config连接字符串应如下所示:

    <connectionStrings>
        <add name="ConnectionString.Region1.WebSite.com"   connectionString="Data Source=serverNameForRegion1;Et Cetera" />
        <add name="ConnectionString.Region2.WebSite.com"   connectionString="Data Source=serverNameForRegion2;Et Cetera" />
        <add name="ConnectionString.Region3.WebSite.com"   connectionString="Data Source=serverNameForRegion3;Et Cetera" />
    </connectionStrings>
    

    将任何剩余的特定于区域的配置存储在数据库中

    每个数据库都有自己的配置副本,所以你只需要使用正确的连接字符串检索它们,你就可以获得正确的配置。

答案 1 :(得分:0)

您可以使用ConfigSource保留常见的web.config,然后将其中的一部分移动到单独的文件中。有关详细信息,请参阅this question

在单独的文件中有一些配置后,您可以在运行时选择其他文件:

  

在ASP.NET应用程序中,在运行时,您可以为ConfigSource属性分配备用配置文件的名称。

Link