làm cách nào để đặt ASPNETCORE_ENVIRONMENT được xem xét xuất bản ứng dụng cốt lõi asp.net?


104

khi tôi xuất bản ứng dụng web cốt lõi asp.net của mình lên hệ thống tệp cục bộ của mình, nó luôn sử dụng production-config và biến ASPNETCORE_ENVIRONMENT với giá trị = "Production".

Tôi phải đặt giá trị của biến ASPNETCORE_ENVIRONMENT như thế nào và ở đâu để biến này không chỉ được coi là gỡ lỗi mà còn được xem là xuất bản ? tôi đã thử các tùy chọn sau mà không thành công:

  • trong cài đặt windows
  • trong tệp .pubxml
  • trong khởi chạySettings.json
  • trong project.json

3
Bạn có đọc tài liệu chính thức docs.microsoft.com/en-us/aspnet/core/fundamentals/environments hay này hướng dẫn andrewlock.net/... ?
J. Doe


1
stackoverflow.com/questions/43493259/… cái này có 2 tùy chọn để kiểm tra lỗi thực sự.
Kurkula

Câu trả lời:


84

Ngoài các tùy chọn được đề cập ở trên, có một số Giải pháp khác.

1. Sửa đổi tệp tệp dự án (.CsProj)

MSBuild hỗ trợ EnvironmentNameThuộc tính có thể giúp đặt biến môi trường phù hợp theo Môi trường bạn muốn triển khai. Tên môi trường sẽ được thêm vào web.config trong giai đoạn Xuất bản.

Chỉ cần mở tệp dự án (* .csProj) và thêm XML sau.

<!-- Custom Property Group added to add the Environment name during publish
  The EnvironmentName property is used during the publish for the Environment variable in web.config
  -->
  <PropertyGroup Condition=" '$(Configuration)' == '' Or '$(Configuration)' == 'Debug'">
    <EnvironmentName>Development</EnvironmentName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' != '' AND '$(Configuration)' != 'Debug' ">
    <EnvironmentName>Production</EnvironmentName>
  </PropertyGroup>

Đoạn mã trên sẽ thêm tên môi trường Developmentcho cấu hình Gỡ lỗi hoặc nếu không có cấu hình nào được chỉ định. Đối với bất kỳ Cấu hình nào khác, tên Môi trường sẽ có Productiontrong tệp web.config được tạo. Thêm chi tiết tại đây

2. Thêm Thuộc tính EnvironmentName vào hồ sơ xuất bản.

Chúng tôi cũng có thể thêm <EnvironmentName>tài sản trong hồ sơ xuất bản. Mở tệp hồ sơ xuất bản được đặt tại Properties/PublishProfiles/{profilename.pubxml}Điều này sẽ đặt tên Môi trường trong web.config khi dự án được xuất bản. Thêm chi tiết tại đây

<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

3. Tùy chọn dòng lệnh sử dụng dotnet xuất bản

Ngoài ra, chúng ta có thể chuyển thuộc tính EnvironmentNamenhư một tùy chọn dòng lệnh vào dotnet publishlệnh. Lệnh sau sẽ bao gồm biến môi trường như Developmenttrong tệp web.config.

dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development


7
Đây có vẻ là câu trả lời tốt nhất theo như tôi có thể nói. Khả năng thiết lập nó cho mỗi hồ sơ xuất bản thực sự đã giúp tôi rất nhiều.
Jonathan Quinth

Tùy chọn thứ ba phù hợp với tôi. Bạn có biết nếu / p: tùy chọn EnvironmentName đề cập đến bất kỳ đâu trong tài liệu dotnet không?
rasyadi

8
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Developmentchính xác là những gì tôi đang tìm kiếm. Cảm ơn!
Matt M

Bạn có thể vui lòng cho biết 'dotnet xuất bản ....' hoàn chỉnh là gì nếu ai đó muốn xuất bản lên UAT, QA hoặc Production không?
crazyTech

74

Lựa chọn 1:

Để đặt biến môi trường ASPNETCORE_ENVIRONMENT trong windows,

Dòng lệnh - setx ASPNETCORE_ENVIRONMENT "Development"

PowerShell - $Env:ASPNETCORE_ENVIRONMENT = "Development"

Đối với hệ điều hành khác, hãy tham khảo phần này - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/enosystem

Lựa chọn 2:

Nếu bạn muốn đặt ASPNETCORE_ENVIRONMENT bằng cách sử dụng web.configthì hãy thêm aspNetCorenhư thế này-

<configuration>
  <!--
    Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
  -->
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\MyApplication.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

42
Cả hai đều là những lựa chọn khủng khiếp. 1) đặt điều này cho toàn bộ hệ điều hành, tôi muốn nó trên mỗi trang web trong IIS. 2) AspNet Core không hỗ trợ chuyển đổi web.config. Bạn đề xuất web.config được sửa đổi như thế nào để triển khai?
Kugel

Tham khảo tài liệu chính thức tại đây - docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
Sanket

5
Khi bạn đã tìm ra lựa chọn tốt hơn ... vui lòng chia sẻ ở đây :)
Sanket

5
kiểu thiết kế cấu hình này có vẻ rất lộn xộn.
koo9

2
Bạn có thể ghi đè điều này trong hồ sơ xuất bản cho nhiều môi trường.
cederlof

31

Cách đơn giản để thiết lập nó trong IDE studio trực quan.

Dự án> Thuộc tính> Gỡ lỗi> Biến môi trường

nhập mô tả hình ảnh ở đây


3
Nhưng sau đó bạn cần nhớ thay đổi điều này mỗi khi bạn cần xuất bản sang một môi trường khác.
Alisson

15
Điều đó không chính xác. Điều đó chỉ hoạt động khi chạy IDE. Lưu trữ nó trong tệp khởi chạysettings.json là một thứ của Visual Studio. Sẽ không hoạt động cho các triển khai.
onefootswill

21

Bạn nên làm theo hướng dẫn được cung cấp trong tài liệu , bằng cách sử dụng web.config.

<aspNetCore processPath="dotnet"
        arguments=".\MyApp.dll"
        stdoutLogEnabled="false"
        stdoutLogFile="\\?\%home%\LogFiles\aspnetcore-stdout">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
    <environmentVariable name="CONFIG_DIR" value="f:\application_config" />
  </environmentVariables>
</aspNetCore>

Lưu ý rằng bạn cũng có thể đặt các biến môi trường khác.

Mô-đun lõi ASP.NET cho phép bạn chỉ định các biến môi trường cho quy trình được chỉ định trong thuộc tính processPath bằng cách chỉ định chúng trong một hoặc nhiều phần tử con môi trườngVariable của phần tử thu thập môi trườngVariables trong phần tử aspNetCore. Các biến môi trường được đặt trong phần này được ưu tiên hơn các biến môi trường hệ thống cho quy trình.


làm cách nào để đặt nó trong ứng dụng bảng điều khiển lõi .net?
user441365 18/12/18

Thiết lập chúng thông qua hộp thoại Biến môi trường của Windows.
David Pine

1
Nhưng có cách nào để thiết lập nó trong dự án thay vì hệ điều hành không?
user441365

Không dành cho các ứng dụng bảng điều khiển trong .NET Core mà tôi biết ... không - có thể là điều này - stackoverflow.com/a/46445432/2410379 ?
David Pine

15

Đây là cách chúng ta có thể thiết lập thời gian chạy:

public class Program
{
    public static void Main(string[] args)
    {
        Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");

        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

không chắc tại sao điều này bị bỏ phiếu thấp, vì nó là thứ duy nhất phù hợp với tôi.
pcalkins

1
Nó rất có thể đã bị bỏ phiếu thấp do các giá trị được mã hóa cứng trong mã.
Kevin C.

Nhanh nhất để kiểm tra, nhưng tôi đồng ý không phải thứ mà tôi muốn xem là mã đăng ký, lâu dài hơn.
Brett Rigby

mặc dù đây là mã cứng nhưng tôi thấy đây là cách dễ nhất để thực hiện việc này.
Khởi hành

1
Phương pháp ưa thích của tôi, tôi sử dụng nó kết hợp với DEBUG để đặt giá trị phù hợp.
Dave de Jong

6

Với phiên bản mới nhất của dotnet cli (2.1.400 trở lên), bạn chỉ có thể đặt thuộc tính msbuild này $(EnvironmentName)và công cụ xuất bản sẽ đảm nhận việc thêm ASPNETCORE_ENVIRONMENT vào web.config với tên môi trường.

Ngoài ra, hỗ trợ XDT có sẵn bắt đầu từ 2.2.100-preview1.

Mẫu: https://github.com/vijayrkn/webconfigtransform/blob/master/README.md


7
Bạn có thể giải thích you can just set this msbuild property $(EnvironmentName) and publishhoặc cung cấp một tài liệu tham khảo?
DanElliott

1
làm cách nào để đặt nó trong ứng dụng bảng điều khiển lõi .net?
user441365 18/12/18

5
  1. Tạo các cài đặt ứng dụng của bạn. *. Json tệp. (Ví dụ: appsettings.Development.json, appsettings.Staging.json, appsettings.Production.json)

  2. Thêm các biến của bạn vào các tệp đó.

  3. Tạo một hồ sơ xuất bản riêng cho từng môi trường, giống như bạn thường làm.

  4. Mở PublishProfiles / Development.pubxml (đặt tên sẽ dựa trên những gì bạn đặt tên cho Hồ sơ Xuất bản).

  5. Chỉ cần thêm một thẻ vào PublishProfile để đặt biến EnvironmentName , quy ước đặt tên tệp appsettings. *. Json thực hiện phần còn lại.

    <PropertyGroup>
      <EnvironmentName>Development</EnvironmentName>
    </PropertyGroup>

Tham khảo: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-3.1

Tham khảo phần "Thiết lập Môi trường".


3

Biến này có thể được lưu trong json. Ví dụ envsettings.json với nội dung như bên dưới

  {
   // Possible string values reported below. When empty it use ENV variable value or 
     // Visual Studio setting.
     // - Production
     // - Staging
     // - Test
     // - Development

   "ASPNETCORE_ENVIRONMENT": "Development"
  }

Sau đó sửa đổi chương trình của bạn .cs như bên dưới

  public class Program
  {
    public static IConfiguration Configuration { get; set; }
    public static void Main(string[] args)
    {
        var currentDirectoryPath = Directory.GetCurrentDirectory();
        var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
        var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
        var environmentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();

        var builder = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json");

        Configuration = builder.Build();
          var webHostBuilder = new WebHostBuilder()
            .UseKestrel()
            .CaptureStartupErrors(true)
            .UseContentRoot(currentDirectoryPath)
            .UseIISIntegration()
            .UseStartup<Startup>();

        // If none is set it use Operative System hosting enviroment
        if (!string.IsNullOrWhiteSpace(environmentValue))
        {
            webHostBuilder.UseEnvironment(environmentValue);
        }

        var host = webHostBuilder.Build();

        host.Run();
     }
 }

Bằng cách này, nó sẽ luôn được đưa vào xuất bản và bạn có thể thay đổi thành giá trị yêu cầu tùy theo môi trường nơi trang web được lưu trữ. Phương pháp này cũng có thể được sử dụng trong ứng dụng bảng điều khiển vì các thay đổi trong Program.cs


0

Tôi thấy nó hoạt động với tôi bằng cách đặt biến này trực tiếp trên Azure platorm (nếu bạn sử dụng nó). Chỉ cần chọn ứng dụng web của bạn -> cấu hình -> cài đặt ứng dụng và thêm biến và giá trị của nó, sau đó nhấn nút Lưu.


0

Tùy chọn khác mà chúng tôi sử dụng trong các dự án của mình để có thể thiết lập môi trường cho mỗi trang web là thêm tệp Parameters.xml vào dự án với nội dung sau:

<parameters>
      <parameter name="IIS Web Application Name" defaultValue="MyApp" tags="IisApp" />    
      <parameter name="Environment" description="Environment" tags="">
        <parameterEntry kind="XmlFile" scope="Web.config"  match="/configuration/location/system.webServer/aspNetCore/environmentVariables/environmentVariable[@name='ASPNETCORE_ENVIRONMENT']/@value" />
      </parameter>    
</parameters>

Hành động Xây dựng cho tệp này là Nội dung và Hành động Sao chépSao chép Nếu Mới hơn nên nó sẽ là một phần của gói để triển khai.

Sau đó, để triển khai gói và đặt môi trường, trong Bản phát hành, trong tác vụ "WinRM - IIS Web App Deployment" (nó hoạt động giống như khi sử dụng tác vụ "IIS web app deploy"), chúng tôi đặt các đối số bổ sung cho msdeploy :

-setParam:kind=ProviderPath,scope=contentPath,value="MySite" -setParam:name="Environment",value="Stage"

Bằng cách này, chúng tôi có thể có nhiều bản phát hành, tất cả đều sử dụng cùng một tạo tác, nhưng được triển khai dưới các môi trường khác nhau.


0

Tôi biết đây là một bài viết cũ nhưng tôi nghĩ rằng tôi sẽ đưa giải pháp đơn giản của mình vào hỗn hợp vì không ai đề xuất nó.

Tôi sử dụng thư mục hiện tại để xác định môi trường hiện tại sau đó lật chuỗi kết nối và biến môi trường. Điều này hoạt động hiệu quả miễn là bạn có quy ước đặt tên cho các thư mục trang web của mình như test / beta / sandbox.

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var dir = Environment.CurrentDirectory;
        string connectionString;

        if (dir.Contains("test", StringComparison.OrdinalIgnoreCase))
        {
            connectionString = new ConnectionStringBuilder(server: "xxx", database: "xxx").ConnectionString;
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");
        }
        else
        {
            connectionString = new ConnectionStringBuilder(server: "xxx", database: "xxx").ConnectionString;
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Production");
        }

        optionsBuilder.UseSqlServer(connectionString);
        optionsBuilder.UseLazyLoadingProxies();
        optionsBuilder.EnableSensitiveDataLogging();
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.