在iis

时间:2018-04-08 15:04:13

标签: c# iis asp.net-core .net-core environment-variables

我在visual studio上参与asp.net核心的网站开发。我们创建了一个网站,应该分为多个实例。我只有一个代码和一个发布配置文件(我不希望有多个发布配置文件,只有一个参数更改)。

所有这些网站共享相同的数据库连接,client.json和web.config。我通过实例区分所有这些网站。我不想把这个实例放在client.json中,因为它是共享的。 所有这些网站都由一个应用程序池支持。我不知道这是不是一个好主意,我们已经遵循此过程以帮助维护(例如,在更新的情况下只有一个池重新启动)。

我找到的解决方案是将每个网站的环境变量添加到iis中(参见Publish to IIS, setting Environment Variable)。正如NickAb所说的那样,我将我的client.json覆盖了环境变量(system.webServer/aspNetCore添加到i {上的Configuration editor)的值。它有效。

我的问题是:我在多台服务器上发布了多个网站的代码。我不想手动为每个网站和服务器执行此更新!

我开发了一个中间件,使用Microsoft.Web.Administration在C#中的多个服务器上创建和维护网站。

因此,我搜索如何使用此库向这些网站添加环境变量。

我已经尝试过这种方式:Environment Variables

两个问题: - 我有IIS 10和8(这个解决方案只适用于iis 10) - 代码有效(我的意思是,我也不例外),但我无法在iis网站system.webServer/aspNetCore Configuraton editor中看到结果。

这个解决方案是好的吗?如果是的话,我错过了什么?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

经过更多的研究,我找到了自己的方式。

如下所示,我找到了如何将新的环境变量添加到我的网站(此处为test.fr)到ApplicationHost.config文件中。这个link帮助我理解Microsoft.Web.Administration如何处理这个主题。

IIS Configuration Editor / system.webServer/aspNetCore

这里是我正在使用的代码:

using Microsoft.Web.Administration;
using System;
using System.Collections.Generic;

internal static class Sample
{
    internal static void AddEnvironmentVariablesToWebSite(this ServerManager serverManager, KeyValuePair<string, string> environmentVariable, string siteName)
    {
        if (serverManager == null) throw new ArgumentNullException(nameof(serverManager));

        var config = serverManager.GetApplicationHostConfiguration();
        var aspNetCoreSection = config.GetSection("system.webServer/aspNetCore", siteName);
        var environmentVariablesCollection = aspNetCoreSection.GetCollection("environmentVariables");

        var addElement1 = environmentVariablesCollection.CreateElement(); // CreateElement() is equivalent to CreateElement("add")
        addElement1["name"] = environmentVariable.Key;
        addElement1["value"] = environmentVariable.Value;
        environmentVariablesCollection.Add(addElement1);
        serverManager.CommitChanges();
    }
}

我在创建我的网站的commitChanges()之后使用此方法并将其合并到iis中并将其添加到ApplicationHost.config文件中。

感谢@Lexli blog,请务必等待commitChanges(),因为它会在更改生效之前返回。这是我的第二个问题。

using(var serverManager = new ServerManager())
{
    //[Create site and pool]
    serverManager.CommitChanges();
    Thread.Sleep(100);

    serverManager.AddEnvironmentVariablesToWebSite(serverManager, environmentVariable, siteName);
    serverManager.CommitChanges();
}

希望它有所帮助。