【问题标题】:IIS7 Application ConfigurationIIS7 应用程序配置
【发布时间】:2026-02-15 15:25:05
【问题描述】:

我有一个自定义的 ASP.NET 应用程序,用于我托管的多个客户端。每个客户端都有一个单独的域,应用程序通常是根域 (http://domain.com/customapp) 下的子应用程序。应用程序文件是相同的(aspx、ascx、样式表、图像等)。唯一不同的是每个客户端的 web.config 文件。随着应用程序的开发不断发展,我必须为每个目录更新应用程序,这显然变得乏味。我正在尝试想出一种方法使应用程序保持最新。我的第一个想法是将应用程序放入单个物理路径并创建多个指向该路径的应用程序(这种方法的问题是我不能有不同的 web.config 文件)。我很好奇其他人在这种情况下使用什么解决方案......

【问题讨论】:

    标签: asp.net iis-7 web-config


    【解决方案1】:

    如果您想完全在 Visual Studio 中处理此问题,VS2010 offers web.config transforms 可以解决您的问题。

    简而言之,为每个站点创建一个构建配置(在 VS 中,选择 Build|Configuration Manager...)。为每个客户端添加一个 web.config 转换,它只指定每个应用程序所需的差异。

    我使用它来区分开发、暂存和发布配置 - 每个转换都会调整连接字符串、应用程序设置等 - 它在 Visual Studio 中和通过 MSBuild 部署时都能很好地工作。

    另外,请注意 web.config 设置由 IIS 应用程序继承。所以,如果你有一个根站点

    /root
    

    和客户端应用程序

    /root/client1
    /root/client2
    ...
    

    您可以将特定于客户端的配置设置放在每个特定于客户端的文件夹中的 web.config 中,并将全局设置放在根文件夹中的 web.config 中。

    【讨论】:

    • 谢谢。我正在研究这个并现在对其进行测试。本质上,我现在使用的唯一客户端特定设置是连接字符串和 assemblyBinding\probing 路径。问题出在继承的设置上,我必须清除你提到的连接字符串。
    【解决方案2】:

    您能否将您的 web.config 内容移动到数据库并根据引用的域有条件地加载它?

        Select Case Request.Url.Host.ToLowerInvariant()
            Case "xyz.com", "www.xyz.com"
                'Load XYZ stuff'
            Case "abc.com", "www.abc.com"
                'Load ABC stuff'
            Case Else
                'Throw an error probably'
        End Select
    

    更好的是,将您的域作为键存储在数据库中,这样您就不必接触代码。

    【讨论】:

    • 这是最好的答案。任何多租户架构都会迫使您将租户特定信息放入数据库中。
    • @Chris 取决于租户特定信息的类型。将特定于客户端的连接字符串放入数据库中会出现先有鸡还是先有蛋的窘境。
    • 这是可能的。目前,客户端特定设置是 assemblyBinding 设置中的连接字符串和探测路径。
    • @Jason,所以如果探测路径不同,这是否意味着不是 所有 文件都相同?
    • 有一个插件目录当前不同,它是应用程序的子目录。经过考虑,虽然我可以使用相同的插件目录,这意味着所有文件都是相同的,并将设置存储在数据库中,这样最终会删除探测路径设置。不知道有没有办法在global.config的开始请求中设置探测路径?
    最近更新 更多