通过Service Fabric项目进行调试时未使用的环境变量

在创建ASP.NET Core应用程序时,将为您设置一个名为ASPNETCORE_ENVIRONMENT=Development的环境变量,在调试时您将看到IHostingEnvironment设置为Development

问题是,当我在为Service Fabric设置的解决方案中使用相同的项目时,环境变量似乎没有被注入, IHostingEnvironment只返回“生产”。

我该如何解决这个问题?

注意:我在启动类中设置了一个断点来观察IHostingEnvironment变量。

参考此答案: https : //docs.microsoft.com/en-us/azure/service-fabric/service-fabric-manage-multiple-environment-app-configuration

我遇到了与默认模板相同的问题。 以下类似于Duncan的答案,但有两个重要区别:1)您不必更改服务中的任何模板代码,2) IHostingEnvironment将被正确设置。

首先,将ASPNETCORE_ENVIRONMENT变量添加到应用程序服务的PackageRoot\ServiceManifest.xml文件的元素:

    MyService.exe CodePackage       

与Duncan的回复一样,您将对Service Fabric应用程序项目的ApplicationManifest.xml进行两处更改。 首先,设置一个参数(变量),以便在根据部署项目的方式替换ApplicationParameters文件时对其进行修改。 然后,将EnvironmentalOverrides部分添加到ServiceManifestImport元素。 两个添加的结果将如下所示:

           

最后,您可以在各个ApplicationParameters文件中添加适当的值:

     

此时,您可以从服务的Properties – Debug环境变量中删除该变量。

我遇到了同样的问题,并且能够创建一个适合我的解决方案。

如果查看ASP.NET Core项目,您应该看到Program.cs文件。 在它的底部,您应该看到以下接口实现:

 Task ICommunicationListener.OpenAsync(CancellationToken cancellationToken) { ... } 

您首先要将其更改为以下内容:

 Task ICommunicationListener.OpenAsync(CancellationToken cancellationToken) { var context = FabricRuntime.GetActivationContext(); var endpoint = context.GetEndpoint(_endpointName); var config = context.GetConfigurationPackageObject("Config"); var environment = config.Settings.Sections["Environment"].Parameters["ASPNETCORE_ENVIRONMENT"].Value; var serverUrl = $"{endpoint.Protocol}://{FabricRuntime.GetNodeContext().IPAddressOrFQDN}:{endpoint.Port}"; _webHost = new WebHostBuilder().UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseStartup() .UseEnvironment(environment) .UseUrls(serverUrl) .Build(); _webHost.Start(); return Task.FromResult(serverUrl); } 

关键部分是.UseEnvironment(environment)调用,以及从配置中支持检索环境。 这将为ASP.NET Core提供选择环境所需的必要信息。

完成此操作后,您显然需要将ASPNETCORE_ENVIRONMENT设置添加到配置部分。 看起来如下:

在您的ASP.NET Core项目下,您将找到一个名为PackageRoot / Config的目录。 其中应该有一个Settings.xml文件。 在标记内添加以下代码…

 

接下来,您将要查看实际Service Fabric项目中的ApplicationPackageRoot / ApplicationManifest.xml文件(这不是ASP.NET Core项目)。 需要更改两个文件。

  1. 在文件顶部的标记内添加ASPNETCORE_ENVIRONMENT参数,如下所示:

      
  2. 修改标记以包含部分,如下所示:

        

最后,修改ApplicationParameters / Local.1Node.xml和朋友以包含ASPNETCORE_ENVIRONMENT参数:

  

添加一个可以检索的怪异变量是很多步骤,但它确实允许您具有很大的灵活性,并遵循标准的Service Fabric模式来简化部署。 我希望这有帮助!

Duncan的答案对我有用,但对我来说有一个小的变化,可能是由于我使用的ASP.NET Core和Service Fabric版本。

我需要在Web无状态服务中覆盖方法CreateServiceInstanceListeners 。 这意味着我将拥有以下代码:

 protected override IEnumerable CreateServiceInstanceListeners() { return new ServiceInstanceListener[] { new ServiceInstanceListener(serviceContext => new WebListenerCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) => { ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting WebListener on {url}"); var environment = FabricRuntime.GetActivationContext() ?.GetConfigurationPackageObject("Config") ?.Settings.Sections["Environment"] ?.Parameters["ASPNETCORE_ENVIRONMENT"]?.Value; return new WebHostBuilder().UseWebListener() .ConfigureServices( services => services .AddSingleton(serviceContext)) .UseContentRoot(Directory.GetCurrentDirectory()) .UseStartup() .UseEnvironment(environment) .UseApplicationInsights() .UseUrls(url) .Build(); })) }; } 

当然,您需要按照Duncan的说明设置ASPNETCORE_ENVIRONMENT变量。