Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多租户环境中,使用.Net Core,如何配置Windows服务以正确的数据库为目标 问题的快速版本:_C#_.net Core_Azure Devops_Windows Services - Fatal编程技术网

C# 在多租户环境中,使用.Net Core,如何配置Windows服务以正确的数据库为目标 问题的快速版本:

C# 在多租户环境中,使用.Net Core,如何配置Windows服务以正确的数据库为目标 问题的快速版本:,c#,.net-core,azure-devops,windows-services,C#,.net Core,Azure Devops,Windows Services,如何配置.Net Core windows服务,以便在多租户环境中以正确的数据库为目标,在多租户环境中,每个租户都有自己的数据库,并且都运行在同一个自托管服务器上 一些背景信息: 我正在开发一个新的windows服务,因为它是全新的,所以我们将使用.NETCore。我读过这篇文章,它确实讨论了如何在IIS应用程序中设置环境变量,azure,全局,每个命令窗口,但它并没有真正提到windows服务,azure devops或如何处理多租户环境 我能想到的最好的办法是,在windows服务创建后,您

如何配置.Net Core windows服务,以便在多租户环境中以正确的数据库为目标,在多租户环境中,每个租户都有自己的数据库,并且都运行在同一个自托管服务器上

一些背景信息: 我正在开发一个新的windows服务,因为它是全新的,所以我们将使用.NETCore。我读过这篇文章,它确实讨论了如何在IIS应用程序中设置环境变量,azure,全局,每个命令窗口,但它并没有真正提到windows服务,azure devops或如何处理多租户环境

我能想到的最好的办法是,在windows服务创建后,您应该在开始参数中设置环境变量,但这似乎非常脆弱。当你看到25家公司的潜力达到或超过100家(我们是一家成长中的小公司)时,这就成了一个更大的问题。如果我们决定将服务迁移到另一台服务器,那么必须返回并手动设置所有这些变量的想法并不令人愉快

因此,问题的较长版本是:我是否在正确的轨道上,或者是否有更好的方法来设置它,使其不会变成这样一个手动过程?也许在将服务部署到服务器时设置一个变量就可以做到这一点?但是,我如何使用azure devops实现这一点

编辑1 下面是我们运行这些服务的环境的表示

Databases (separate machine):
Shared1
Db1
Db2
Db3

Machines:
Server1

Windows Services:
Service1
Service2
Service3
数据库正在数据库服务器上运行。每个服务有一个数据库,并且有一个共享数据库存储一些公共信息(不要认为这与问题相关)。有一台服务器。在这台服务器上有需要作为windows服务运行的代码副本。服务的副本数与数据库数相对应。因此,对于上述场景:
Serivce1
连接到
Db1
Service2
连接到
Db2
Service3
连接到
Db3
,等等

因为我只有一台机器,如果我将一个环境变量设置为类似于
ASPNETCORE_DB1
的值,那么所有三个服务都将读取该变量并连接到
DB1
,这是不需要的


如果我设置了多个环境变量:
ASPNETCORE\u Db1
ASPNETCORE\u Db2
ASPNETCORE\u Db2
,每个服务如何知道要读取哪个环境变量?

我感觉您在这里混合了一些东西

  • 如果希望每个环境有不同的设置,只需使用
    CreateHostBuilder
    方法即可。你可以看看这个。然后,您需要在托管应用程序的计算机上设置
    ASPNETCORE\u环境
    环境变量。在这种方法中,运行时应用程序选择适当的配置。但是,请不要在配置文件中保留敏感数据。在这种方法中,您有一个针对所有租户的编译代码
  • 您可以在构建应用程序时传递配置。要做到这一点,您应该定义变量组(在Azure DevOps上)(每十个一个)并将您的秘密刷新到配置文件中。此外,您还可以使用它定义目标租户。仍然不够安全,因为在工件(编译代码)中可以找到秘密。在这种方法中,每个租户有一个编译代码
  • 如果您可以使用Azure KeyVault,我建议您使用这种方法。您可以为每个tenat创建一个KeyVault,然后在
    CreateHostBuilder
    中从适当的KeyVault加载机密(如果您使用租户名称命名KeyVault,将简化选择适当的KeyVault)。你可以看看这个
  • 根据你的问题,我假设你的tenat=environment。如果没有,那么您可以为每个env(如Dev、QA和PROD)设置一个KeyVault。然后您应该使用以下模式命名机密{tenant\u name}{secret\u name}。您应该在启动应用程序时加载所有机密,然后在运行时(基于租户id)选择适当的机密


    我希望它能帮助您做出正确的决定。

    为每个环境变量获取相应的数据库连接字符串是更好的方法。简单步骤:

  • 在每个环境/机器中手动定义具有不同值(connectionstring)的相同环境变量
  • 在windows服务应用程序中获取该环境变量值,并将该值用作数据库connectionstring(如果不为null),否则使用默认connectionstring 编辑: 对于同一台计算机上的多个windows服务,我建议您可以将connectionstring per指定为当前服务名称


    对于#1,听起来我不能在同一台服务器上拥有多个服务,因为您谈到了在服务器级别设置环境变量。这对我不起作用,因为一台服务器将承载此应用程序的副本,而每个租户都有一个副本。我正试图避免#2,因为我不希望每个租户都进行构建。我不确定#3将如何在#1之上构建它。如果#1不起作用,那么这将使我没有选择进行一次构建?好几天没有得到您的回复,starian的回答有用吗?如果您有任何问题,请随意在这里分享。@Hugh Lin-MSFT根据我的理解,没有。我的阅读方式是:Server1:EnvVar_Db1、EnvVar_Db2、EnvVar_Db2。那么,服务的每个实例如何知道要查找哪个环境变量呢?我看到这一点的唯一方法是定义一个构建值,每个租户都需要自己的构建。我真的希望避免这种情况。另外,似乎.Net Core是使用build once开发的,部署了很多,但这在多租户环境中似乎会出现问题。我想我也会在这里回答:如果没有某种特殊的构建标志,每个服务如何知道要获取哪个环境变量?文档介绍了如何将环境变量设置为d