0

在ASP.NET Core MVC项目中有一个Angular 2应用程序。 Angular 2应用程序和Startup.cs都将具有特定环境的代码,即。请使用http://localhost作为网络服务网址,而不是http://devserver(应在发布时使用)。我需要以编程方式执行此操作,所以我宁愿不在操作系统中设置ASPNETCORE_ENVIRONMENT。有没有办法做到这一点?如何为Angular 2和ASP.NET Core创建共享环境变量MVC

+1

你要什么有完成这个?你只是想分开不同环境的担忧,或者你想在应用程序运行时更改这些值吗? – eminlala

回答

0

我设法做到了这一点。不知道这是否是最佳解决方案,但对我有用。

请注意,最后我选择了基于配置的文件(即使用.Debug.file,如果您在Debug配置中)将config作为解决方案,而不是基于环境变量的。

创建appsettings.json。当您按F5在调试模式下运行项目时,这将被读取。同时设定appsettings.jsonCopy to Output directory: Copy if newer”:

{ 
    "AppSettings": { 
    "MyApiUrl": "http://localhost:23224/v1/" 
    } 
} 

创建appsettings.Debug.json。这将被用来当您发布项目(假设你使用Debug配置发布):

{ 
    "AppSettings": { 
    "MyApiUrl": "http://api.server.com/v1/" 
    } 
} 

编辑您的.csproj添加AfterBuild事件appsettings.json文件复制到/wwwroot当你建立(假设你的角2应用程序在wwwroot文件夹),所以角可以读取它:

<Target Name="AfterBuildOperations" AfterTargets="AfterBuild"> 
    <Copy SourceFiles="$(ProjectDir)appsettings.json" DestinationFiles="$(ProjectDir)wwwroot\appsettings.json" OverwriteReadOnlyFiles="true" /> 
    </Target> 

编辑您的.csproj重命名appsettings.Debug.jsonappsettings.json并将其复制到文件夹wwwroot当您发布它。出于某种原因,VS.NET发布包括在发布的输出文件夹都appsettings.json和appsettings.Debug.json:

<Target Name="AfterPublishOperations" AfterTargets="AfterPublish"> 
    <Delete Files="$(ProjectDir)bin\$(ConfigurationName)\PublishOutput\appsettings.json" /> 
    <Copy SourceFiles="$(ProjectDir)bin\$(ConfigurationName)\PublishOutput\appsettings.$(ConfigurationName).json" DestinationFiles="$(ProjectDir)bin\$(ConfigurationName)\PublishOutput\appsettings.json" /> 
    <Delete Files="$(ProjectDir)bin\$(ConfigurationName)\PublishOutput\appsettings.$(ConfigurationName).json" /> 
    <Copy SourceFiles="$(ProjectDir)bin\$(ConfigurationName)\PublishOutput\appsettings.json" DestinationFiles="$(ProjectDir)bin\$(ConfigurationName)\PublishOutput\wwwroot\appsettings.json" OverwriteReadOnlyFiles="true" /> 
    </Target> 

添加AppSettings.cs模型到您的项目获得配置强类型:

public class AppSettings 
    { 
     public string MyApiUrl { get; set; } 
    } 
Startup.cs

阅读appsettings.json内容,并将其添加为单到DI容器:

public void ConfigureServices(IServiceCollection services) 
     { 
      var appSettings = ReadConfiguration(); 
      services.AddSingleton(appSettings); 
     } 

     public AppSettings ReadConfiguration() 
     { 
      var section = Configuration.GetSection("AppSettings"); 
      var settings = new AppSettings(); 
      new ConfigureFromConfigurationOptions<AppSettings>(section).Configure(settings); 

      return settings; 
     } 

可以注入ppSettings到你的控制器:

private AppSettings appSettings; 

public MyController(AppSettings appSettings) 
{ 
    this.appSettings = appSettings; 
} 

添加AppSettings.ts到您的角2

export interface AppSettings { 
    MyApiUrl?: string; 
} 

现在你可以看任何你想在角2:

private ReadAppSettings() { 
     this.http.get('/appsettings.json') 
      .map(response => response.json()) 
      .subscribe(result => { 
       let appSettings: AppSettings = <AppSettings>result.AppSettings; 
      }, 
      error => { console.error(error); }); 
    }