通过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项目)。 需要更改两个文件。
-
在文件顶部的
标记内添加ASPNETCORE_ENVIRONMENT参数,如下所示: -
修改
标记以包含
部分,如下所示:
最后,修改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
变量。
- .NET Core – 尝试将存储库添加到我的API控制器,但是当我执行每个控制器方法时都会返回500错误
- 在ASP.NET Core中的Program.Main中访问环境名称
- 从.NET Core / ASP.NET Core中的类库访问App密钥数据
- ASP.NET Core Identity 3 Cookie超时
- Asp.net Core Post参数始终为null
- 将google idToken替换为本地openId令牌c#
- 无法读取dotnet核心中链接的appsettings.json文件的值
- User.IsInRole在ASP.NET Core中没有返回任何内容(已实现存储库模式)
- 在MVC控制器内打开websocket通道