IIS के लिए प्रकाशित, पर्यावरण चर सेट




asp.net-core visual-studio-2015 (9)

इन दो प्रश्नों / उत्तरों को पढ़कर मैं IIS 8.5 सर्वर पर Asp.net 5 ऐप चला पा रहा था।

Asp.net vNext विंडोज़ सर्वर में IIS के शुरुआती बीटा प्रकाशित होते हैं

IIS पर काम करने के लिए MVC6 ऐप को कैसे कॉन्फ़िगर करें?

समस्या यह है कि IIS पर चलने पर भी वेब ऐप अभी भी env.EnvironmentName का उपयोग मूल्य Development साथ कर रहा है।

इसके अलावा, मैं एक ही सर्वर पर एक ही वेब (स्टेजिंग, प्रोडक्शन) के दो संस्करण चलाना चाहता हूं, इसलिए मुझे प्रत्येक वेब के लिए चर को अलग से सेट करने के लिए एक विधि की आवश्यकता है।

यह कैसे करना है?


@ Tredder के उत्तर पर विस्तार करने के लिए आप 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


अन्य उत्तरों के समान, मैं अपने ASP.NET Core 2.1 पर्यावरण की स्थापना को सुनिश्चित करना चाहता था, जो केवल तैनाती पर ही कायम थे, लेकिन केवल विशिष्ट साइट पर ही लागू होते थे।

Microsoft के दस्तावेज़ के अनुसार, IIS 10 में निम्न PowerShell कमांड का उपयोग करके ऐप पूल पर पर्यावरण चर को सेट करना संभव है:

$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 का उपयोग करना है और मुझे लगा कि मैं भाग्य से बाहर हूं। हालाँकि, ASPNETCORE_ENVIRONMENT के लिए साइट-विशिष्ट वातावरण चर मान सेट करने के लिए एक साधारण PowerShell स्क्रिप्ट चलाना अभी भी संभव है:

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 }

आप वैकल्पिक रूप से वांछित ASPNETCORE_ENVIRONMENT में ASPNETCORE_ENVIRONMENT प्रकाशन कमांड में एक तर्क का उपयोग करके पास कर सकते हैं:

/p:EnvironmentName=Staging

उदाहरण के लिए:

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

यह आपके प्रोजेक्ट के लिए निर्दिष्ट सही वातावरण के साथ web.config उत्पन्न करेगा:

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

आपको एक स्थान पर क्या जानना चाहिए:

  • पर्यावरण चर के लिए किसी भी विन्यास सेटिंग्स को ओवरराइड करने के लिए, उन्हें 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-safe नहीं हैं, उन्हें यूनिकोड के रूप में छोड़ दिया जा सकता है, जैसे कि बाएं कर्ली ब्रैकेट के लिए %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 तरह कुछ का उपयोग करें। %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

एडिटिंग एप्लीकेशनहॉस्ट.कॉनफिग के साथ @ ट्रेडर समाधान वह है जो काम करता है यदि आपके पास IIS पर वर्चुअल निर्देशिकाओं में कई अलग-अलग एप्लिकेशन हैं।

मेरा मामला यह है:

  • मेरे पास एक ही डोमेन के तहत अलग-अलग आभासी निर्देशिकाओं में एपीआई परियोजना और एपीपी परियोजना है
  • रूट पेज 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 को पुनरारंभ करने ने काम किया।


त्रुटि के बारे में विवरण प्राप्त करने के लिए मुझे इसी एप्लिकेशन पूल system.applicationHost/applicationPools लिए ASPNETCORE_ENVIRONMENT पर्यावरण चर जोड़ना पड़ा ASPNETCORE_ENVIRONMENT system.applicationHost/applicationPools

नोट: मेरे मामले में वेब अनुप्रयोग ASP.NET Core 2 वेब अनुप्रयोग IIS 10 पर होस्ट किया गया था। इसे IIS Manager में Configuration Editor माध्यम से किया जा सकता है ( IIS Manager संपादक में इस संपादक को खोजने के लिए कॉन्फ़िगरेशन संपादक के साथ संपादन संग्रह देखें)।


यह उत्तर मूल रूप से ASP.NET Core RC1 के लिए लिखा गया था। RC2 में ASP.NET Core जेनेरिक httpPlafrom हैंडलर से एक विशिष्ट aspnetCore में चले गए। ध्यान दें कि चरण 3 ASP.NET कोर के किस संस्करण पर निर्भर करता है जिसका आप उपयोग कर रहे हैं।

ASP.NET के लिए पर्यावरण चर को चालू करता है। कोर परियोजनाओं को उपयोगकर्ता के लिए पर्यावरण चर निर्धारित किए बिना या कई कमांड प्रविष्टियां बनाने के लिए सेट किया जा सकता है।

  1. IIS में अपने आवेदन पर जाएं और Configuration Editor
  2. Configuration Editor चयन करें
  3. system.webServer/aspNetCore (RC2 और RTM) या system.webServer/httpPlatform (RC1) का चयन करें
  4. Applicationhost.config ... कॉम्बोबॉक्स में From चुनें।
  5. enviromentVariables तत्व पर राइट क्लिक करें, 'environmentVariables' element , फिर Edit Items
  6. अपने पर्यावरण चर सेट करें।
  7. विंडो बंद करें और अप्लाई पर क्लिक करें।
  8. किया हुआ

इस तरह आपको अपने पूल के लिए विशेष उपयोगकर्ता बनाने या project.json में अतिरिक्त कमांड प्रविष्टियां बनाने की आवश्यकता नहीं है। इसके अलावा, प्रत्येक वातावरण के लिए विशेष कमांड जोड़ने से "बिल्ड एक बार, कई बार परिनियोजित होता है", क्योंकि आपको एक बार प्रकाशित करने और परिणामी विरूपण साक्ष्य को तैनात करने के बजाय, प्रत्येक पर्यावरण के लिए अलग-अलग dnu publish होगा।

आरसी 2 और आरटीएम के लिए अपडेट किया गया, मार्क जी और ट्रेडर के लिए धन्यवाद।


व्यापक गुगली के बाद मुझे एक कार्यशील समाधान मिला, जिसमें दो चरण होते हैं।

पहला कदम सिस्टम वाइड वातावरण चर ASPNET_ENV को Windows सर्वर के उत्पादन और पुनः आरंभ करने के लिए सेट करना है। इसके बाद, सभी वेब ऐप्स को पर्यावरण नाम के रूप में 'प्रोडक्शन' का मूल्य मिल रहा है।

दूसरा चरण (वेब ​​का मंचन करने के लिए मूल्य 'मंचन को सक्षम करने के लिए) सही ढंग से काम करना अधिक कठिन था, लेकिन यहां यह है:

  1. नई विंडोज़ उपयोगकर्ता बनाएँ, उदाहरण के लिए सर्वर पर StagingPool
  2. इस उपयोगकर्ता के लिए, मान 'स्टेजिंग' के साथ नया उपयोगकर्ता चर ASPNETCORE_ENVIRONMENT बनाएं (आप इसे इस उपयोगकर्ता के रूप में या regedit के माध्यम से लॉग इन करके कर सकते हैं)
  3. IIS प्रबंधक में व्यवस्थापक के रूप में वापस, एप्लिकेशन पूल खोजें जिसके तहत स्टेजिंग वेब चल रहा है और उन्नत सेटिंग्स में उपयोगकर्ता को स्टेजिंगपूल की पहचान सेट करें।
  4. लोड उपयोगकर्ता प्रोफ़ाइल को भी सही पर सेट करें, ताकि पर्यावरण चर लोड हो जाएं। <- बहुत महत्वपूर्ण!
  5. सुनिश्चित करें कि स्टैगिंगपूल के पास वेब फ़ोल्डर तक पहुंच अधिकार है और एप्लिकेशन पूल को रोकें और शुरू करें।

अब स्टेजिंग वेब में 'स्टेजिंग' के लिए एनवायरनमेंट सेट होना चाहिए।

अद्यतन: विंडोज 7+ में एक कमांड है जो सीएमडी प्रॉम्प्ट से पर्यावरण चर भी निर्दिष्ट उपयोगकर्ता के लिए सेट कर सकता है। यह आउटपुट मदद करता है प्लस नमूने:

>setx /?

संपादित करें: RC2 और RTM रिलीज़ के रूप में, यह सलाह पुरानी है। रिलीज के समय इसे पूरा करने का सबसे अच्छा तरीका है कि प्रत्येक पर्यावरण के लिए IIS में निम्नलिखित web.config अनुभागों को संपादित किया जाए:

system.webServer/aspNetCore :

पर्यावरणीय प्रवेश को संपादित करें और एक पर्यावरण चर सेटिंग जोड़ें:

ASPNETCORE_ENVIRONMENT : < Your environment name >

Drpdrp के दृष्टिकोण के विकल्प के रूप में, आप निम्न कार्य कर सकते हैं:

  • अपने प्रोजेक्ट.जसन में, 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 उपयोगकर्ता बनाने की तुलना में कम दखल देने वाला लगा।





asp.net-core-mvc