我在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
中看到结果。
这个解决方案是好的吗?如果是的话,我错过了什么?
提前感谢您的帮助。
答案 0 :(得分:1)
经过更多的研究,我找到了自己的方式。
如下所示,我找到了如何将新的环境变量添加到我的网站(此处为test.fr)到ApplicationHost.config
文件中。这个link帮助我理解Microsoft.Web.Administration
如何处理这个主题。
这里是我正在使用的代码:
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();
}
希望它有所帮助。