เผยแพร่ไปยัง IIS การตั้งค่าตัวแปรสภาพแวดล้อม


134

การอ่านคำถาม / คำตอบทั้งสองนี้ฉันสามารถเรียกใช้แอป Asp.net 5 บนเซิร์ฟเวอร์ IIS 8.5 ได้

Asp.net vNext เบต้าต้นเผยแพร่ไปยัง IIS ใน windows server

วิธีกำหนดค่าแอป MVC6 ให้ทำงานบน IIS ได้อย่างไร

ปัญหาคือแอปพลิเคชันเว็บยังคงใช้งานอยู่env.EnvironmentNameกับค่าDevelopmentแม้ว่าจะทำงานบน IIS

นอกจากนี้ฉันต้องการเรียกใช้เว็บเดียวกันสองรุ่น (Staging, Production) บนเซิร์ฟเวอร์เดียวกันดังนั้นฉันจึงต้องการวิธีการตั้งค่าตัวแปรสำหรับแต่ละเว็บแยกกัน

ทำอย่างไร


4
โดยทั่วไปจะมีสามสภาพแวดล้อมเครือข่ายการพัฒนาการจัดเตรียมและการผลิต เว็บเซิร์ฟเวอร์อยู่ในสภาพแวดล้อมเดียว ดังนั้นการตั้งค่าตัวแปรสภาพแวดล้อมของระบบสำหรับเซิร์ฟเวอร์จึงไม่ใช่ข้อ จำกัด ที่แท้จริง หนึ่งยังคงสามารถใช้Properties\launchSettings.jsonเพื่อจำลองสภาพแวดล้อมอื่นสำหรับการดีบักใน Visual Studio
Oleg

คำตอบ:


286

คำตอบนี้ถูกเขียนขึ้นครั้งแรกสำหรับ ASP.NET Core RC1 ใน RC2 ASP.NET Core ย้ายจากตัวจัดการ httpPlafrom ทั่วไปไปเป็น aspnetCore เฉพาะ โปรดทราบว่าขั้นตอนที่ 3 ขึ้นอยู่กับ ASP.NET Core รุ่นที่คุณใช้

ปรากฎว่าตัวแปรสภาพแวดล้อมสำหรับโครงการ ASP.NET Core สามารถตั้งค่าได้โดยไม่ต้องตั้งค่าตัวแปรสภาพแวดล้อมสำหรับผู้ใช้หรือต้องสร้างรายการคำสั่งหลายรายการ

  1. ไปที่แอพลิเคชันของคุณใน IIS Configuration Editorและเลือก
  2. เลือก Configuration Editor
  3. เลือกsystem.webServer/aspNetCore(RC2 และ RTM) หรือsystem.webServer/httpPlatform(RC1) ในSectionคอมโบ
  4. เลือกApplicationhost.config ...ในFromcombobox
  5. คลิกขวาที่enviromentVariablesองค์ประกอบที่เลือกแล้ว 'environmentVariables' elementEdit Itemsป้อนคำอธิบายรูปภาพที่นี่
  6. ตั้งค่าตัวแปรสภาพแวดล้อมของคุณ
  7. ปิดหน้าต่างแล้วคลิกนำไปใช้
  8. เสร็จสิ้น

project.jsonวิธีนี้คุณจะได้ไม่ต้องสร้างผู้ใช้เป็นพิเศษสำหรับสระว่ายน้ำของคุณหรือสร้างรายการคำสั่งพิเศษในการ นอกจากนี้การเพิ่มคำสั่งพิเศษสำหรับแต่ละสภาพแวดล้อมแบ่ง "สร้างครั้งเดียวปรับใช้หลายครั้ง" ตามที่คุณจะต้องโทรdnu publishแยกต่างหากสำหรับแต่ละสภาพแวดล้อมแทนการเผยแพร่ครั้งเดียวและปรับใช้สิ่งประดิษฐ์ที่เกิดขึ้นหลายครั้ง

อัปเดตสำหรับ RC2 และ RTM ขอบคุณ Mark G และ tredder


12
สำหรับขั้นตอนที่ 3 ฉันใช้system.webServer/aspNetCoreแทน
Mark G

1
ตัวแปรสภาพแวดล้อมของระบบได้รับการสืบทอดโดยกระบวนการเมื่อเริ่มต้น ดังนั้นหากคุณเปลี่ยนตัวแปร env บางส่วนในระหว่างการรันแอปพลิเคชันของคุณคุณจะไม่สามารถเห็นการเปลี่ยนแปลงนี้ได้ตามค่าเริ่มต้น เพื่อให้การเปลี่ยนแปลง env var มีผลคุณจะต้องมีอย่างน้อยในการรีสตาร์ทไซต์อาจรวมหรือบริการ IIS ขึ้นอยู่กับวิธีที่ IIS สร้างกระบวนการ สิ่งนี้จะต้องมีการทดสอบ
NickAb

7
การตั้งค่าที่เพิ่มผ่านเครื่องมือแก้ไขการกำหนดค่าจะไม่ถูกลบล้างในการปรับใช้ครั้งถัดไปหรือไม่
แบรดการ์ดเนอร์

11
@ brad-gardner หากมีการเปลี่ยนแปลง Applicationhost.config แทน web.config การเปลี่ยนแปลงจะยังคงอยู่ระหว่างการปรับใช้
NickAb

15
ใช้งานได้กับ Asp.Net Core 2.0
Frank Cannon

34

อัพเดตweb.configด้วยส่วน<environmentVariables>ภายใต้<aspNetCore>

<configuration>
  <system.webServer>
    <aspNetCore .....>
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

หรือเพื่อหลีกเลี่ยงการสูญเสียการตั้งค่านี้เมื่อเขียนทับ web.config ให้ทำการเปลี่ยนแปลงที่คล้ายกับapplicationHost.config โดยระบุตำแหน่งของไซต์ตามที่ @NickAb แนะนำ

<location path="staging.site.com">
    <system.webServer>
        <aspNetCore>
            <environmentVariables>
                <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
            </environmentVariables>
        </aspNetCore>
    </system.webServer>
</location>
<location path="production.site.com">
    <system.webServer>
        <aspNetCore>
            <environmentVariables>
                <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
            </environmentVariables>
        </aspNetCore>
    </system.webServer>
</location>

2
สิ่งนี้แตกต่างกันในวิธีที่ web.config ของคุณเป็นส่วนหนึ่งของโครงการและมีเวอร์ชันใน VCS หากคุณมีหลายสภาพแวดล้อมเช่น prod, staging, dev คุณจะต้องมีวิธีในการแปลง web.config สำหรับแต่ละคน การเปลี่ยน ApplicationHost.config ใน IIS มีผลกับ IIS นี้เท่านั้น เพื่อให้คุณสามารถมี web.config เดียวใน VCS และตัวแปรสภาพแวดล้อมเฉพาะของ IIS ที่แทนที่ตัวแปร web.config ApplicationHost.config สามารถแก้ไขได้ทางโปรแกรมโดยใช้ PowerShell iis.net/learn/manage/powershell/ …
NickAb

ขอบคุณ @NickAb ที่หลีกเลี่ยงการอัปเดต web.config ทุกการปรับใช้ ฉันอัพเดตคำตอบแล้ว
เทรเวอร์แดเนียลส์

ฉันมีปัญหากับการทำสิ่งนี้จาก powershell ฉันได้รับตามTarget configuration object '/system.webServer/aspNetCore/environmentVariables/environmentVariable is not found ... ปกติเพื่อตั้งค่าตัวแปรบางอย่างฉันจะเขียนบางอย่างเช่นนี้: Set-WebConfigurationProperty -PSPath IIS:\ -location example.com -filter /system.webServer/aspNetCore/environmentVariables/environmentVariable -name ASPNETCORE_ENVIRONMENT -value Staging สิ่งที่ฉันขาดหายไป?
คริสเตียน

ฉันกลับไปที่สิ่งที่ฉันรู้และนำมาใช้appcmdแทน
คริสเตียน

@Christian ลองดูคำตอบนี้: stackoverflow.com/a/50869935/33533ชื่อตัวแปรและค่าสภาพแวดล้อมจะอยู่ในตารางแฮชดังนั้นจากตัวอย่างของคุณมันอาจเป็นได้Set-WebConfigurationProperty -PSPath IIS:\ -Location example.com -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = 'Staging' }
Curtis ซื้อ

21

แก้ไข: ตั้งแต่รุ่น RC2 และ RTM คำแนะนำนี้ล้าสมัย วิธีที่ดีที่สุดที่ฉันพบเพื่อให้บรรลุผลในรุ่นนี้คือการแก้ไขส่วน web.config ต่อไปนี้ใน IIS สำหรับแต่ละสภาพแวดล้อม:

system.webServer/aspNetCore:

แก้ไขรายการ environmentVariable และเพิ่มการตั้งค่าตัวแปรสภาพแวดล้อม:

ASPNETCORE_ENVIRONMENT : < Your environment name >


เป็นอีกทางเลือกหนึ่งสำหรับแนวทางของ drpdrp คุณสามารถทำสิ่งต่อไปนี้:

  • ใน project.json ของคุณเพิ่มคำสั่งที่ส่งผ่านตัวแปร ASPNET_ENV ไปยัง Kestrel โดยตรง:

    "commands": {
        "Development": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Development",
        "Staging": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Staging",
        "Production": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Production"
    }
    
  • เมื่อเผยแพร่ให้ใช้--iis-commandตัวเลือกเพื่อระบุสภาพแวดล้อม:

    dnu publish --configuration Debug --iis-command Staging --out "outputdir" --runtime dnx-clr-win-x86-1.0.0-rc1-update1
    

ฉันพบวิธีการนี้จะก้าวก่ายน้อยกว่าการสร้างผู้ใช้ IIS เพิ่มเติม


11
หากคุณกำลังเผยแพร่ผ่าน msdeploy ของ visual studio จากนั้นคุณสามารถวาง <IISCommand> Staging </IISCommand> ในไฟล์. pubxml ของคุณและมันจะปรับใช้โดยใช้คำสั่ง IIS ที่ระบุแม้ว่าคุณไม่สามารถระบุได้ใน UI การเผยแพร่
Dean North

@DeanNorth - นี่คือสีทอง !! ทำงานเหมือนแชมป์! ขอบคุณสำหรับการแบ่งปัน!
S. Rasmussen

17

ฉันมีเว็บแอปพลิเคชั่นของฉัน (PRODUCTION, STAGING, TEST) ที่โฮสต์บน IIS เว็บเซิร์ฟเวอร์ ดังนั้นจึงเป็นไปไม่ได้ที่จะพึ่งพาระบบตัวแปรสภาพแวดล้อมของ ASPNETCORE_ENVIRONMENT เนื่องจากการตั้งค่าเป็นค่าเฉพาะ (ตัวอย่างเช่น STAGING) มีผลกับแอปพลิเคชันอื่น

ในระหว่างการทำงานฉันได้กำหนดไฟล์ที่กำหนดเอง (envsettings.json) ภายในโซลูชัน visualstudio ของฉัน:

ป้อนคำอธิบายรูปภาพที่นี่

มีเนื้อหาดังต่อไปนี้:

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

จากนั้นขึ้นอยู่กับประเภทแอปพลิเคชันของฉัน (การผลิต, การจัดเตรียมหรือการทดสอบ) ฉันตั้งค่าไฟล์นี้ตามลำดับ: หากว่าฉันกำลังปรับใช้แอปพลิเคชันทดสอบฉันจะมี:

"ASPNETCORE_ENVIRONMENT": "Test"

หลังจากนั้นในไฟล์ Program.cs เพียงดึงค่านี้แล้วตั้งค่าสภาพแวดล้อมของ webHostBuilder:

    public class Program
    {
        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 enviromentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();

            var webHostBuilder = new WebHostBuilder()
                .UseKestrel()
                .CaptureStartupErrors(true)
                .UseSetting("detailedErrors", "true")
                .UseContentRoot(currentDirectoryPath)
                .UseIISIntegration()
                .UseStartup<Startup>();

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

            var host = webHostBuilder.Build();

            host.Run();
        }
    }

อย่าลืมรวม envsettings.json ใน publishOptions (project.json):

  "publishOptions":
  {
    "include":
    [
      "wwwroot",
      "Views",
      "Areas/**/Views",
      "envsettings.json",
      "appsettings.json",
      "appsettings*.json",
      "web.config"
    ]
  },

วิธีการแก้ปัญหานี้ทำให้ฉันมีอิสระที่จะมี ASP.NET CORE application บน IIS เดียวกันโดยไม่ขึ้นกับค่าตัวแปรสภาพแวดล้อม


เยี่ยมมากการเปลี่ยนแปลงอย่างเดียวที่ฉันแนะนำคือ swap var currentDirectoryPath = Directory.GetCurrentDirectory (); สำหรับ var currentDirectoryPath = PlatformServices.Default.Application.ApplicationBasePath; นี่เป็นวิธีที่ปลอดภัยกว่ามากในการรับ dir ปัจจุบัน
Peter Kottas

7
ช่างเป็นประสบการณ์ที่ยอดเยี่ยมมากเมื่อคุณต้องสร้างเลเยอร์ของการกำหนดค่าใหม่เพื่อจัดการโครงร่างของเฟรมเวิร์ก
Kugel

16

หลังจาก googling อย่างกว้างขวางฉันพบวิธีการทำงานซึ่งประกอบด้วยสองขั้นตอน

ขั้นตอนแรกคือการตั้งค่าตัวแปรสภาพแวดล้อมทั้งระบบ ASPNET_ENV ไปยังการผลิตและรีสตาร์ท Windows ServerServer หลังจากนี้เว็บแอปทั้งหมดจะได้รับค่า 'การผลิต' เป็น EnvironmentName

ขั้นตอนที่สอง (เพื่อเปิดใช้งานค่า 'Staging' สำหรับการจัดเตรียมเว็บ) ค่อนข้างยากกว่าในการทำงานอย่างถูกต้อง แต่นี่คือ:

  1. สร้างผู้ใช้ windows ใหม่ตัวอย่างเช่นStagingPoolบนเซิร์ฟเวอร์
  2. สำหรับผู้ใช้นี้สร้างตัวแปรผู้ใช้ใหม่ ASPNETCORE_ENVIRONMENT ด้วยค่า 'Staging' (คุณสามารถทำได้โดยเข้าสู่ระบบในฐานะผู้ใช้นี้หรือผ่านทาง regedit)
  3. กลับมาเป็นผู้ดูแลระบบในตัวจัดการ IIS ค้นหากลุ่มแอปพลิเคชันที่เว็บ Staging กำลังทำงานอยู่และในการตั้งค่าขั้นสูงตั้งค่า Identity ให้กับผู้ใช้StagingPool StagingPool
  4. นอกจากนี้ยังตั้งโหลดโปรไฟล์ผู้ใช้ที่จะเป็นจริงเพื่อให้สภาพแวดล้อมของตัวแปรที่มีการโหลด <- สำคัญมาก!
  5. ตรวจสอบให้แน่ใจว่าStagingPoolมีสิทธิ์เข้าถึงเว็บโฟลเดอร์และหยุดและเริ่มพูลโปรแกรมประยุกต์

ตอนนี้เว็บ Staging ควรมี EnvironmentName ตั้งค่าเป็น 'Staging'

อัปเดต: ใน Windows 7+ มีคำสั่งที่สามารถตั้งค่าตัวแปรสภาพแวดล้อมจากพรอมต์ CMD ได้เช่นกันสำหรับผู้ใช้ที่ระบุ เอาต์พุตนี้ช่วยบวกตัวอย่าง:

>setx /?

1
ปรากฏว่าใน ASP.NET 5 RC1 ตัวแปรสภาพแวดล้อมถูกเปลี่ยนเป็น Hosting: Environment
Grady Werner

เราจะตั้งค่า "โหลดโปรไฟล์ผู้ใช้" เป็นจริงได้อย่างไรเมื่อเราปรับใช้กับ Azure Web App
Puneet Ghanshani

@PunitGanshani ดังที่ฉันเข้าใจมีส่วน "การตั้งค่าแอปพลิเคชัน" ในพอร์ทัล Azure สำหรับเว็บแอปที่คุณสามารถตั้งค่าคู่คีย์ / ค่าของสภาพแวดล้อม: azure.microsoft.com/en-us/documentation/articles/ ......
drpdrp

@GradyWerner สำหรับ RC2 พวกเขากำลังเปลี่ยนมัน (จนถึงตอนนี้) เป็น ASPNET_ENVIRONMENT ;-)
b.pell

1
@ b.pell ดูเหมือนว่าจะเป็นตอนนี้ ASPNETCORE_ENVIRONMENT :)
Mark G

11

คุณสามารถส่งผ่านตามที่ต้องการASPNETCORE_ENVIRONMENTไปยังคำสั่ง dotnet publish เป็นอาร์กิวเมนต์โดยใช้:

/p:EnvironmentName=Staging

เช่น:

dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging

สิ่งนี้จะสร้าง web.config ด้วยสภาพแวดล้อมที่ถูกต้องซึ่งระบุไว้สำหรับโครงการของคุณ:

<environmentVariables>
  <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>

9

นอกเหนือจากตัวเลือกที่กล่าวถึงข้างต้นยังมีโซลูชันอื่น ๆ อีกสองสามตัวที่ทำงานได้ดีกับการปรับใช้อัตโนมัติหรือต้องการเปลี่ยนแปลงการกำหนดค่าน้อยลง

1. การแก้ไขไฟล์โครงการ (.CsProj)

MSBuild สนับสนุนEnvironmentNameคุณสมบัติซึ่งสามารถช่วยในการตั้งค่าตัวแปรสภาพแวดล้อมที่เหมาะสมตามสภาพแวดล้อมที่คุณต้องการปรับใช้ ชื่อสภาพแวดล้อมจะถูกเพิ่มใน web.config ในระหว่างขั้นตอนการเผยแพร่

เพียงเปิดไฟล์โครงการ (* .csProj) และเพิ่ม XML ต่อไปนี้

<!-- 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>

โค้ดด้านบนจะเพิ่มชื่อสภาพแวดล้อมDevelopmentสำหรับการกำหนดค่า Debug หรือหากไม่ได้ระบุการกำหนดค่าไว้ สำหรับการกำหนดค่าอื่น ๆ ชื่อสภาพแวดล้อมจะอยู่Productionในไฟล์ web.config ที่สร้างขึ้น รายละเอียดเพิ่มเติมที่นี่

2. การเพิ่มคุณสมบัติ EnvironmentName ในโปรไฟล์เผยแพร่

เราสามารถเพิ่ม<EnvironmentName>คุณสมบัติในโปรไฟล์การเผยแพร่เช่นกัน เปิดไฟล์โพรไฟล์เผยแพร่ซึ่งอยู่ที่Properties/PublishProfiles/{profilename.pubxml}นี้ซึ่งจะตั้งค่าชื่อสภาพแวดล้อมใน web.config เมื่อโครงการถูกเผยแพร่ รายละเอียดเพิ่มเติมที่นี่

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

3. ตัวเลือกบรรทัดคำสั่งโดยใช้ดอทเน็ตเผยแพร่

นอกจากนี้เราสามารถส่งผ่านคุณสมบัติEnvironmentNameเป็นตัวเลือกบรรทัดคำสั่งไปยังdotnet publishคำสั่ง คำสั่งดังต่อไปนี้จะรวมตัวแปรสภาพแวดล้อมเช่นเดียวกับDevelopmentในไฟล์ web.config

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


7

หากต้องการขยายคำตอบของ @ tredder คุณสามารถแก้ไข environmentVariables ได้โดยใช้ appcmd

จัดฉาก

%windir%\system32\inetsrv\appcmd set config "staging.example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Staging'] /commit:APPHOST

การผลิต

%windir%\system32\inetsrv\appcmd set config "example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production'] /commit:APPHOST


นี่คือวิธีการทำสิ่งเดียวกันกับ Powershell บนบิลด์เซิร์ฟเวอร์โดยไม่ต้องติดตั้ง IIS gist.github.com/markarnott/c4aec1fc544fe89e2bd21f3f00d78933
Mark Arnott

การระบุ "staging.example.com" หรือ "example.com" จะใช้ตัวแปรกับเว็บไซต์เฉพาะเหล่านั้นเท่านั้น การข้ามที่จะสร้างตัวแปรส่วนกลางสำหรับเว็บไซต์ทั้งหมดบนเซิร์ฟเวอร์
deadlydog

6

สิ่งที่คุณต้องรู้ในที่เดียว:

  • สำหรับตัวแปรสภาพแวดล้อมแทนที่การตั้งค่าการตั้งค่าใด ๆ ASPNETCORE_ที่พวกเขาจะต้องนำหน้าด้วย
  • หากคุณต้องการจับคู่โหนดชายน์ในการกำหนดค่า JSON ของคุณให้ใช้:เป็นตัวคั่น หากแพลตฟอร์มไม่อนุญาตให้ใช้โคลอนในคีย์ตัวแปรสภาพแวดล้อมให้ใช้__แทน
  • ApplicationHost.configคุณต้องการตั้งค่าของคุณจะจบลงใน การใช้ตัวแก้ไขการกำหนดค่า IIS จะทำให้อินพุตของคุณถูกเขียนไปยังแอปพลิเคชันWeb.config- และจะถูกเขียนทับด้วยการปรับใช้ครั้งต่อไป!
  • สำหรับการปรับเปลี่ยนApplicationHost.configคุณต้องการใช้appcmd.exeเพื่อให้แน่ใจว่าการปรับเปลี่ยนของคุณสอดคล้องกัน ตัวอย่าง:%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /+"environmentVariables.[name='ASPNETCORE_AWS:Region',value='eu-central-1']" /commit:site

  • อักขระที่ไม่ปลอดภัยต่อ URL สามารถถูกยกเว้นเป็น Unicode เช่น%u007bวงเล็บปีกกาซ้าย

  • หากต้องการแสดงรายการการตั้งค่าปัจจุบันของคุณ (รวมกับค่าจาก Web.config): %systemroot%\system32\inetsrv\appcmd.exe list config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore
  • หากคุณรันคำสั่งเพื่อตั้งค่าคีย์การกำหนดค่าหลาย ๆ ครั้งสำหรับคีย์เดียวกันมันจะถูกเพิ่มหลายครั้ง! %systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /-"environmentVariables.[name='ASPNETCORE_MyKey',value='value-to-be-removed']" /commit:siteในการลบค่าที่มีอยู่ใช้สิ่งที่ต้องการ

1
โปรดทราบว่าด้วย/commit:siteการเปลี่ยนแปลงจะถูกเขียนใน web.config เพื่อที่จะบันทึกไว้ในสิ่งที่ApplicationHost.configควรใช้/commit:apphost
Angel Yordanov

-section:system.webServer/aspNetCore /-"environmentVariables.(พร้อมลบเพื่อลบตัวแปรสภาพแวดล้อม) ไม่สามารถดำเนินการได้ในระหว่างขั้นตอนการเผยแพร่ Azure hresult:80070032, message:Command execution failedมีข้อผิดพลาด อย่างไรก็ตามใช้clear config "Default Web Site/$(webSiteName)" -section:system.webServer/aspNetCore /commit:siteงานได้ดี มันล้างส่วน aspNetCore ทั้งหมดสำหรับเว็บไซต์ แต่ก็ไม่เป็นปัญหาเพราะมันถูกปิดกั้นระหว่างการเปิดตัว
oleksa

6

คล้ายกับคำตอบอื่น ๆ ฉันต้องการให้แน่ใจว่าการตั้งค่าสภาพแวดล้อม ASP.NET Core 2.1 ของฉันยังคงมีอยู่ตลอดการปรับใช้ แต่ยังใช้กับไซต์เฉพาะเท่านั้น

ตามเอกสารของ Microsoft เป็นไปได้ที่จะตั้งค่าตัวแปรสภาพแวดล้อมในแอพโดยใช้คำสั่ง PowerShell ต่อไปนี้ใน IIS 10:

$appPoolName = "AppPool"
$envName = "Development"
cd "$env:SystemRoot\system32\inetsrv"
.\appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='$appPoolName'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='$envName']" /commit:apphost

ฉันโชคยังต้องใช้ IIS 8.5 และคิดว่าฉันโชคไม่ดี อย่างไรก็ตามยังคงสามารถเรียกใช้สคริปต์ PowerShell แบบง่าย ๆ เพื่อตั้งค่าตัวแปรสภาพแวดล้อมเฉพาะไซต์สำหรับ ASPNETCORE_ENVIRONMENT:

Import-Module -Name WebAdministration
$siteName = "Site"
$envName = "Development"
Set-WebConfigurationProperty -PSPath IIS:\ -Location $siteName -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = $envName }

5

@tredder solution พร้อมกับapplicationHost.configเป็นวิธีที่ใช้ได้ผลถ้าคุณมีแอพพลิเคชั่นต่าง ๆ ที่อยู่ในไดเรกทอรีเสมือนบน IIS

กรณีของฉันคือ:

  • ฉันมีโครงการAPIและโครงการAPPภายใต้โดเมนเดียวกันอยู่ในไดเรกทอรีเสมือนที่แตกต่างกัน
  • รูทเพจXXXดูเหมือนว่าจะไม่เผยแพร่ตัวแปร ASPNETCORE_ENVIRONMENT ให้กับลูก ๆ ในไดเรกทอรีเสมือนและ ...
  • ... ฉันไม่สามารถตั้งค่าตัวแปรภายในไดเรกทอรีเสมือนตามที่อธิบายไว้ @NickAb (มีข้อผิดพลาดไม่รองรับการร้องขอ (ยกเว้นจาก HRESULT: 0x80070032)ระหว่างการบันทึกการเปลี่ยนแปลงในเครื่องมือแก้ไขการกำหนดค่า):
  • ไปที่applicationHost.configและสร้างโหนดด้วยตนเองดังนี้:

    <location path="XXX/app"> <system.webServer> <aspNetCore> <environmentVariables> <clear /> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" /> </environmentVariables> </aspNetCore> </system.webServer> </location> <location path="XXX/api"> <system.webServer> <aspNetCore> <environmentVariables> <clear /> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" /> </environmentVariables> </aspNetCore> </system.webServer> </location>

และรีสตาร์ท IIS ก็ทำงานได้


0

เพื่อรับรายละเอียดเกี่ยวกับข้อผิดพลาดฉันต้องเพิ่มASPNETCORE_ENVIRONMENTตัวแปรสภาพแวดล้อมสำหรับ Application Pool ที่ system.applicationHost/applicationPoolsเกี่ยวข้อง

หมายเหตุ: โปรแกรมประยุกต์บนเว็บในกรณีของฉันถูกโปรแกรมเว็บโฮสต์บนASP.NET Core 2 IIS 10มันสามารถทำได้ผ่านConfiguration EditorในIIS Manager(ดูการแก้ไขคอลเลกชันด้วยเครื่องมือแก้ไขการกำหนดค่าเพื่อหาที่ที่จะหาโปรแกรมแก้ไขนี้IIS Manager)


0

ฉันได้สร้างที่เก็บสำหรับเผยแพร่ IIS ด้วยการกำหนดค่าสภาพแวดล้อมใน Web.config

https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

  • ติดตั้ง
    • รับส่วนจากไฟล์. csproj และ. user.csproj ลงในไฟล์โครงการของคุณ
    • รับไฟล์ MyAspNetEnvironment.props, web.development.config และ web.production.config
  • องค์ประกอบ
    • เปลี่ยนค่าของคุณสมบัติ ASPNETCORE_ENVIRONMENT ใน user.csproj ที่เกี่ยวข้อง

สิ่งนี้ดูเหมือนจะไม่ได้ให้คำตอบที่มีคุณภาพสำหรับคำถาม โปรดแก้ไขคำตอบของคุณโดยเพิ่มรายละเอียดโดยรวมของโซลูชันนี้หรือเพียงแค่ลบออกแล้วโพสต์เป็นความคิดเห็นของคำถาม ขอบคุณ!
sɐunıɔןɐqɐp

0

ฉันได้แก้ไขคำตอบที่@Christian Del Biancoให้ไว้ ฉันเปลี่ยนกระบวนการสำหรับ. net core 2 ขึ้นไปเป็นไฟล์ project.json ในตอนนี้

  1. ก่อนอื่นให้สร้างไฟล์appsettings.jsonในไดเรกทอรีราก กับเนื้อหา

      {
         // Possible string values reported below. When empty it use ENV 
            variable value or Visual Studio setting.
         // - Production
         // - Staging
         // - Test
        // - Development
       "ASPNETCORE_ENVIRONMENT": "Development"
     }
    
  2. จากนั้นสร้างไฟล์การตั้งค่าอีกสองไฟล์ appsettings.Development.jsonและappsettings.Production.jsonด้วยการกำหนดค่าที่จำเป็น

  3. เพิ่มรหัสที่จำเป็นเพื่อตั้งค่าสภาพแวดล้อมให้เป็นไฟล์Program.cs

    public class Program
    {
    public static void Main(string[] args)
    {
        var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
    
      ***var currentDirectoryPath = Directory.GetCurrentDirectory();
        var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
        var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
        var enviromentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();***
    
        try
        {
            ***CreateWebHostBuilder(args, enviromentValue).Build().Run();***
        }
        catch (Exception ex)
        {
            //NLog: catch setup errors
            logger.Error(ex, "Stopped program because of setup related exception");
            throw;
        }
        finally
        {
            NLog.LogManager.Shutdown();
        }
    }
    
    public static IWebHostBuilder CreateWebHostBuilder(string[] args, string enviromentValue) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
            })
            .UseNLog()
            ***.UseEnvironment(enviromentValue);***
    

    }

  4. เพิ่มenvsettings.jsonลงในไฟล์. csprojของคุณเพื่อคัดลอกไปยังไดเรกทอรีที่เผยแพร่

       <ItemGroup>
            <None Include="envsettings.json" CopyToPublishDirectory="Always" />
        </ItemGroup>
    
  5. ตอนนี้เพียงเปลี่ยนASPNETCORE_ENVIRONMENTตามที่คุณต้องการในไฟล์envsettings.jsonและเผยแพร่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.