一文輕松了解ASP.NET與ASP.NET?Core多環(huán)境配置對(duì)比
前言
多環(huán)境配置應(yīng)該都很熟悉了,最為常見(jiàn)的環(huán)境便是Debug和Release,例如下圖是新建的一個(gè)asp.net項(xiàng)目,配置文件展開(kāi)共有三個(gè)文件組成
有些開(kāi)發(fā)者從來(lái)沒(méi)了解過(guò)Web.Debug.config和Web.Release.config,始終是一個(gè)Web.config文件改來(lái)改去來(lái)切換不同的配置,但凡有點(diǎn)追求都不能忍受這種煎熬。
asp.net下的多環(huán)境配置
雙擊打開(kāi)Web.Debug.config和Web.Release.config任何一個(gè),看看里面的內(nèi)容。
Web.Debug.config
<?xml version="1.0" encoding="utf-8"?> <!-- 有關(guān)使用 Web.config 轉(zhuǎn)換的詳細(xì)信息,請(qǐng)?jiān)L問(wèn) https://go.microsoft.com/fwlink/?LinkId=301874 --> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <!-- 在下例中,“SetAttributes”轉(zhuǎn)換將更改 “connectionString”的值,僅在“Match”定位器找到值為“MyDB”的 特性“name”時(shí)使用“ReleaseSQLServer”。 <connectionStrings> <add name="MyDB" connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> </connectionStrings> --> <system.web> <!-- 在以下示例中,"Replace" 轉(zhuǎn)換將替換 Web.config 文件的 整個(gè) <customErrors> 節(jié)。 請(qǐng)注意,由于在 <system.web> 節(jié)點(diǎn)下只有一個(gè) customErrors 節(jié),因此無(wú)需使用 "xdt:Locator" 屬性。 <customErrors defaultRedirect="GenericError.htm" mode="RemoteOnly" xdt:Transform="Replace"> <error statusCode="500" redirect="InternalError.htm"/> </customErrors> --> </system.web> </configuration>
微軟為了讓我們使用它,把不僅給出示例,還配上詳細(xì)的注釋,看過(guò)注釋和示例大概就該知道如何進(jìn)行配置,覆蓋Web.config中的配置。
下面展示下最為常用的appSettings如何配置
<!--Web.config 開(kāi)發(fā)環(huán)境--> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> <add key="MyKey" value="Myvalue" /> </appSettings>
<!--Web.Release.config 生產(chǎn)環(huán)境--> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> <add key="MyKey" value="Releasvalue" xdt:Transform="Replace" xdt:Locator="Match(key)" /> </appSettings>
經(jīng)過(guò)這樣的配置后,本機(jī)開(kāi)發(fā)時(shí)讀取到MyKey的值為Myvalue,發(fā)布生產(chǎn)環(huán)境時(shí)值為Releasvalue。
按照上面的配置,本地發(fā)布程序試試效果。
發(fā)布成功后,打開(kāi)發(fā)布后生成的Web.config文件,我們發(fā)現(xiàn)開(kāi)發(fā)環(huán)境下Web.config中對(duì)應(yīng)的值被替換了,這樣開(kāi)發(fā)和生產(chǎn)配置分別配置在不同文件,不需要頻繁修改配置文件切換配置了。
如何增加額外的環(huán)境配置
有時(shí)候Debug和Release兩個(gè)環(huán)境還不能滿足我們的需要,需要增加更多的環(huán)境配置。
打開(kāi)菜單生成-->配置管理器,新建一個(gè)TEST1
環(huán)境
然后右鍵Web.config選擇添加配置轉(zhuǎn)換(第四個(gè))
會(huì)自動(dòng)生成一個(gè)Web.TEST1.config文件,非常的人性化,然后我們?cè)谠撐募渲靡恍﹨?shù)。
更改發(fā)布的配置,進(jìn)行發(fā)布。
打開(kāi)發(fā)布成功后的Web.config
文件
效果與預(yù)期一致。
aspnetcore下的多環(huán)境配置
aspnetcore中的配置文件被appsettings.json
所取代,.NET Core中的配置是使用一個(gè)或多個(gè)配置提供程序執(zhí)行的。 配置提供程序使用各種配置源從鍵值對(duì)讀取配置數(shù)據(jù):
什么是配置提供程序
下表顯示了 .NET Core 應(yīng)用可用的配置提供程序。
提供程序 | 通過(guò)以下對(duì)象提供配置 |
---|---|
Azure 應(yīng)用配置提供程序 | Azure 應(yīng)用程序配置 |
Azure Key Vault 配置提供程序 | Azure Key Vault |
命令行配置提供程序 | 命令行參數(shù) |
自定義配置提供程序 | 自定義源 |
環(huán)境變量配置提供程序 | 環(huán)境變量 |
文件配置提供程序 | JSON、XML 和 INI 文件 |
Key-per-file 配置提供程序 | 目錄文件 |
內(nèi)存配置提供程序 | 內(nèi)存中集合 |
應(yīng)用機(jī)密(機(jī)密管理器) | 用戶配置文件目錄中的文件 |
詳細(xì)內(nèi)容參考 .NET 中的配置
https://docs.microsoft.com/zh-cn/dotnet/core/extensions/configuration
其中以下部分比較值得注意
劃重點(diǎn):后來(lái)添加的配置提供程序會(huì)替代之前的密鑰設(shè)置appsettings.Development.json
比appsettings.json
后加載,則后加載的會(huì)覆蓋先加載配置的值,沒(méi)毛病!
多環(huán)境配置文件時(shí)如何加載
為了徹底弄清楚底層加載邏輯,下載源碼一探究竟。
builder.ConfigureAppConfiguration((hostingContext, config) => { var env = hostingContext.HostingEnvironment; config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); if (env.IsDevelopment()) { if (!string.IsNullOrEmpty(env.ApplicationName)) { var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName)); if (appAssembly != null) { config.AddUserSecrets(appAssembly, optional: true); } } } config.AddEnvironmentVariables(); if (args != null) { config.AddCommandLine(args); } })
默認(rèn)的WebHostBuilder
實(shí)現(xiàn)中,用環(huán)境變量env.EnvironmentName
值拼接的json文件進(jìn)行加載。這也是為什么開(kāi)發(fā)階段會(huì)加載appsettings.Development.json
配置文件的原理。
開(kāi)發(fā)階段的多環(huán)境
如何傳參修改環(huán)境變量EnvironmentName
值是問(wèn)題的關(guān)鍵,若能修改想要的值,然后創(chuàng)建對(duì)應(yīng)名稱的配置文件即可。
在web根目錄存在一個(gè)文件:Properties/launchSettings.json
其中有一個(gè)配置環(huán)境變量的配置
"environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" },
本地開(kāi)發(fā)時(shí)只需要?jiǎng)?chuàng)建多個(gè)啟動(dòng)配置,分別設(shè)置不同的ASPNETCORE_ENVIRONMENT即可進(jìn)行切換了,修改后的launchSettings.json
// launchSettings.json { "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:2364", "sslPort": 44302 } }, "profiles": { "Web1": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, "applicationUrl": "https://localhost:7006;http://localhost:5006", "dotnetRunMessages": true }, "Web1:Test": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "TEST" }, "applicationUrl": "https://localhost:7006;http://localhost:5006", "dotnetRunMessages": true } } }
Web1和Web1:Test啟動(dòng)選項(xiàng)便會(huì)同步顯示在VS啟動(dòng)選項(xiàng)中,切換為Web1:Test再運(yùn)行程序,就會(huì)加載appsettings.TEST.json
,效果和appsettings.Development.json
沒(méi)區(qū)別。
發(fā)布階段的實(shí)現(xiàn)多環(huán)境配置
在上文中我們學(xué)會(huì)了在本地配置多個(gè)不同環(huán)境配置進(jìn)行開(kāi)發(fā),那如果需要發(fā)布的生產(chǎn)環(huán)境也有很多種配置,那如何讓程序自動(dòng)加載不同的配置文件呢,畢竟launchSettings.json
文件只是在開(kāi)發(fā)時(shí)搭配VS用的,既然launchSettings.json
可以配置環(huán)境變量,沒(méi)了它我們手動(dòng)創(chuàng)建環(huán)境變量應(yīng)該也可以。在操作系統(tǒng)添加環(huán)境變量如:
也可以在程序啟動(dòng)時(shí)通過(guò)命令行傳參設(shè)置環(huán)境值。
但是這兩種我都感覺(jué)不方便,我們希望程序根據(jù)不同的環(huán)境發(fā)布好以后,只需要直接執(zhí)行就好,而不是需要進(jìn)行額外的配置或傳參。
EnvironmentName 屬性
在項(xiàng)目的工程文件中有EnvironmentName屬性,可以指定當(dāng)前EnvironmentName值,添加如下代碼
然后編譯后的,直接運(yùn)行,就能夠讀取到appsettings.TEST.json
配置文件。
這配置不會(huì)覆蓋launchSettings.json
中指定的環(huán)境值,但在影響發(fā)布后的EnvironmentName值,從而可以改變實(shí)現(xiàn)發(fā)布后默認(rèn)的EnvironmentName值。
那這樣設(shè)置后,豈不是發(fā)布后的EnvironmentName值只能是Test,如果要發(fā)布其他環(huán)境還要每次發(fā)布前修改這個(gè)值,那不是很麻煩嗎?
沒(méi)錯(cuò)如果沒(méi)有點(diǎn)其他手段,那這真是多此一舉啊,請(qǐng)看下圖。
懂了吧,我們只需要多配置一個(gè)PublishProfile發(fā)布文件,指定不同的配置項(xiàng),然后結(jié)合Condition條件來(lái)控制EnvironmentName。
至此,完美實(shí)現(xiàn)根據(jù)不同環(huán)境選擇不同的發(fā)布文件,進(jìn)行發(fā)布項(xiàng)目,目標(biāo)機(jī)器不需要做任何配置,直接運(yùn)行就是我們想要的效果。
總結(jié)雖然ASP.NET和ASP.NETCore實(shí)現(xiàn)多環(huán)境的方式不同,但是最后發(fā)布時(shí)我們可以做到一樣的效果,所有的配置都是一次性的,發(fā)布時(shí)指定對(duì)應(yīng)的PublishProfile即可。
總結(jié)
到此這篇關(guān)于ASP.NET與ASP.NET Core多環(huán)境配置對(duì)比的文章就介紹到這了,更多相關(guān)ASP.NET ASP.NETCore多環(huán)境配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#.net格式化時(shí)間字符串達(dá)到不同的顯示效果
時(shí)候我們要對(duì)時(shí)間進(jìn)行轉(zhuǎn)換,達(dá)到不同的顯示效果,本文將幫助你實(shí)現(xiàn)這個(gè)多彩的效果,整理很詳細(xì),以備不時(shí)之需,感興趣的朋友可以了解下,或許本文對(duì)你有所幫助2013-01-01.NET?Core利用BsonDocumentProjectionDefinition和Lookup進(jìn)行?join?
這篇文章主要介紹了.NET?Core利用BsonDocumentProjectionDefinition和Lookup進(jìn)行join關(guān)聯(lián)查詢,這里主要介紹一下查詢角色的所有用戶的例子,文章結(jié)合實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10ASP.NET?Core獲取正確查詢字符串參數(shù)示例
這篇文章主要為大家介紹了ASP.NET?Core正確獲取查詢字符串參數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Asp.Net?Core配置多環(huán)境log4net配置文件的全過(guò)程
在.NET世界中有非常多的日志框架,然而log4net是目前為止最流行的一款日志框架,下面這篇文章主要給大家介紹了關(guān)于Asp.Net?Core配置多環(huán)境log4net配置文件的相關(guān)資料,需要的朋友可以參考下2022-04-04asp.net微信開(kāi)發(fā)(消息應(yīng)答)
這篇文章主要介紹了asp.net微信開(kāi)發(fā)中有關(guān)消息應(yīng)答的相關(guān)內(nèi)容,需要的朋友可以參考下2015-11-11Visual Studio實(shí)現(xiàn)xml文件使用app.config、web.config等的智能提示
這篇文章主要為大家詳細(xì)介紹了Visual Studio中xml文件使用app.config、web.config等的智能提示方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09linq to sql 中,如何解決多條件查詢問(wèn)題,答案,用表達(dá)式樹(shù)! (下)
在上一篇中,我們做了基于linq to sql 的多條件組合查詢,但通過(guò)監(jiān)視數(shù)據(jù)庫(kù)發(fā)現(xiàn),這樣做的成本比較高,每次都要取出全部的數(shù)據(jù)到內(nèi)存進(jìn)行篩選.2011-08-08