附註
如需 .NET Framework 中的 ASP.NET,請參閱 設定 Azure App Service 的 ASP.NET 應用程式。 如果您的 ASP.NET Core 應用程式是在自訂 Windows 或 Linux 容器中執行,請參閱 設定 Azure App Service 的自定義容器。
ASP.NET Core 應用程式必須以編譯的二進位檔部署至 Azure App Service。 Visual Studio 發佈工具會建置方案,然後直接部署已編譯的二進位檔。 App Service 部署引擎會先部署程式代碼存放庫,然後編譯二進位檔。
本指南為 ASP.NET Core 開發人員提供重要概念和指示。 如果本文是您第一次使用 Azure App Service,請先遵循 部署 ASP.NET Web 應用程式 ,並將 ASP.NET Core 和 Azure SQL Database 應用程式部署至 Azure App Service。
顯示支援的 .NET Core 執行階段版本
在 App Service 中,Windows 執行個體已安裝所有支援的 .NET Core 版本。 若要查看您可用的 .NET Core 運行時間和 SDK 版本,請移至 Kudu 網站。
在 Azure 入口網站中移至您的應用程式,然後選取 [開發工具>]。 選取 [開始]。 在 Kudu 中,選取 CMD 或 PowerShell 的 [偵錯控制台]。
在瀏覽器型控制台中執行下列命令:
dotnet --info
顯示 .NET Core 版本
若要顯示目前的 .NET Core 版本,請在 Azure Cloud Shell 中執行下列命令:
az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion
若要顯示所有支援的 .NET Core 版本,請在 Cloud Shell 中執行下列命令:
az webapp list-runtimes --os linux | grep DOTNET
設定 .NET Core 版本
在專案檔中設定您 ASP.NET Core 專案的目標框架。 如需詳細資訊,請參閱 選取要使用的 .NET Core 版本。
若要將 .NET Core 版本設定為 8.0,請在 Cloud Shell 中執行下列命令:
az webapp config set --name <app-name> --resource-group <resource-group-name> --linux-fx-version "DOTNETCORE|8.0"
App Service 中過期的執行階段發生什麼事?
過時的執行階段已遭維護組織淘汰,或有重大弱點。 因此,它們會從門戶中的建立和設定頁面中移除。 當入口網站隱藏過期的運行時間時,仍在使用該運行時間的任何應用程式會繼續執行。
如果您想要以不再顯示於入口網站上的過時執行階段版本建立應用程式,請使用 Azure CLI、ARM 範本或 Bicep。 這些部署替代項目可讓您建立已從入口網站中移除、但仍受支援的已棄用執行階段。
如果從 App Service 平臺完全移除運行時間,您的 Azure 訂用帳戶擁有者會在移除之前收到電子郵件通知。
自訂組建自動化
如果您使用 已啟用組建自動化的 Git 或 ZIP 套件來部署應用程式,App Service 組建自動化會遵循下列順序:
- 執行自訂指令碼 (如果
PRE_BUILD_SCRIPT_PATH已指定)。 - 若要還原 NuGet 相依性,請執行
dotnet restore。 - 若要建置生產環境的二進位檔,請執行
dotnet publish。 - 執行自訂指令碼 (如果
POST_BUILD_SCRIPT_PATH已指定)。
PRE_BUILD_COMMAND 和 POST_BUILD_COMMAND 是預設為空值的環境變數。 若要執行建置前命令,請定義 PRE_BUILD_COMMAND。 若要執行建置後命令,請定義 POST_BUILD_COMMAND。
下列範例會將兩個變數指定給一系列的命令 (以逗號分隔)。
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PRE_BUILD_COMMAND="echo foo, scripts/prebuild.sh"
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings POST_BUILD_COMMAND="echo foo, scripts/postbuild.sh"
如需可用來自定義組建自動化的其他環境變數,請參閱 Oryx 組態。
如需 App Service 如何在 Linux 中執行和建置 ASP.NET Core 應用程式的詳細資訊,請參閱 Oryx 檔:如何偵測及建置 .NET Core 應用程式。
存取環境變數
在 App Service 中,您可以在應用程式程式代碼之外 設定應用程式設定 。 接著,您可以使用標準 ASP.NET Core 相依性插入模式,在任何類別中存取它們:
using Microsoft.Extensions.Configuration;
namespace SomeNamespace
{
public class SomeClass
{
private IConfiguration _configuration;
public SomeClass(IConfiguration configuration)
{
_configuration = configuration;
}
public SomeMethod()
{
// retrieve nested App Service app setting
var myHierarchicalConfig = _configuration["My:Hierarchical:Config:Data"];
// retrieve App Service connection string
var myConnString = _configuration.GetConnectionString("MyDbConnection");
}
}
}
如果您在 App Service 和 appsettings.json中設定具有相同名稱的應用程式設定,App Service 值會優先於 appsettings.json 值。 透過使用本地 appsettings.json 值,您可以在本地進行應用程式的偵錯。 藉由使用 App Service 值,您可以使用生產設定在生產環境中執行應用程式。 連接字串的運作方式相同。 藉由使用此方法,您可以將應用程式秘密保留在程式代碼存放庫之外,並存取適當的值,而不需要變更您的程序代碼。
附註
您也可以考慮更安全的連線選項,而不需要連線秘密。 如需詳細資訊,請參閱 從 Azure App Service 保護 Azure 服務和資料庫的連線。
中的appsettings.json是使用 __ (雙底線) 分隔符號進行存取,這是 Linux 上的 .NET Core 標準。 若要覆寫 App Service 中的特定階層式設定資料,請在索引鍵中設定使用相同分隔格式的應用程式設定名稱。 您可以在 Cloud Shell 中執行下列範例:
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings My__Hierarchical__Config__Data="some value"
中的 appsettings.json 是透過使用 .NET Core 標準的 : 分隔符來存取。 若要覆寫 App Service 中的特定階層式設定資料,請在索引鍵中設定使用相同分隔格式的應用程式設定名稱。 您可以在 Azure Cloud Shell 中執行下列範例:
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings My:Hierarchical:Config:Data="some value"
部署多個專案的解決方案
當 Visual Studio 方案包含多個專案時,Visual Studio 發佈程式會選取要部署的專案。 當您部署至 App Service 部署引擎時,例如使用 Git,或 已啟用建置自動化的 ZIP 部署時,App Service 部署引擎會挑選它找到作為 App Service 應用程式的第一個網站或 Web 應用程式專案。 您可以藉由指定 PROJECT 應用程式設定來指定 App Service 應該使用的專案。 例如,在 Cloud Shell 中執行下列命令:
az webapp config appsettings set --resource-group <resource-group-name> --name <app-name> --settings PROJECT="<project-name>/<project-name>.csproj"
存取診斷記錄
ASP.NET Core 提供適用於 App Service 的內建記錄提供者。 在專案的檔案中 program.cs ,透過 ConfigureLogging 擴充方法將提供者新增至您的應用程式,如下列範例所示:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.AddAzureWebAppDiagnostics();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
然後,您可以使用標準 .NET Core 模式來設定及產生記錄。 請參閱 .NET Core 和 ASP.NET Core 中的記錄。
若要存取 App Service 中應用程式程式代碼內產生的控制台記錄,請在 Cloud Shell 中執行下列命令來開啟診斷記錄:
az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose
的可能值為 --levelError、 Warning、 Info和 Verbose。 後續的每個層級都包含上一個層級。 例如, Error 只包含錯誤訊息。
Verbose 包含所有訊息。
開啟診斷記錄之後,請執行下列命令來查看記錄資料流:
az webapp log tail --resource-group <resource-group-name> --name <app-name>
如果主控台記錄未立即出現,請在30秒後再次檢查。
若要隨時停止記錄串流,請選取 Ctrl+C。
如需在 App Service 中針對 ASP.NET Core 應用程式進行疑難解答的詳細資訊,請參閱 針對 Azure App Service 和 IIS 上的 ASP.NET Core 進行疑難解答。
存取詳細的例外狀況頁面
當您的 ASP.NET Core 應用程式在 Visual Studio 調試程式中產生例外狀況時,瀏覽器會顯示詳細的例外狀況頁面。 在 App Service 中,一般 「HTTP 500」或「處理您的要求時發生錯誤」訊息會取代該頁面。 若要在 App Service 中顯示詳細的例外狀況頁面,請在 ASPNETCORE_ENVIRONMENT 中執行下列命令,將應用程式設定新增至您的應用程式。
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings ASPNETCORE_ENVIRONMENT="Development"
偵測 HTTPS 工作階段
在 App Service 中, TLS 終止 會在網路負載平衡器上發生。 所有 HTTPS 要求都會以未加密的 HTTP 要求的形式連線到您的應用程式。 如果您的應用程式邏輯需要知道使用者要求是否已加密,請在 中 Startup.cs設定轉送標頭中間件:
- 設定具有
ForwardedHeadersOptions的中介軟體,以在X-Forwarded-For中轉送X-Forwarded-Proto與Startup.ConfigureServices標頭。 - 將私人 IP 位址範圍新增至已知網路,讓中介軟體可以信任 App Service 負載平衡器。
- 在呼叫其他中間件之前,調用
UseForwardedHeaders方法於Startup.Configure中。
當您組合這三個元素時,您的程式代碼看起來像下列範例:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
// These three subnets encapsulate the applicable Azure subnets. At the moment, it's not possible to narrow it down further.
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("::ffff:10.0.0.0"), 104));
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("::ffff:192.168.0.0"), 112));
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("::ffff:172.16.0.0"), 108));
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseForwardedHeaders();
...
app.UseMvc();
}
如需詳細資訊,請參閱 設定 ASP.NET Core 以使用 Proxy 伺服器和負載平衡器。
重寫或重新導向 URL
若要重寫或重新導向 URL,請使用 ASP.NET Core 中的 URL 重寫中間件。
在瀏覽器中開啟 SSH 工作階段
如果您想要透過容器直接開啟 SSH 工作階段,您的應用程式應在執行中。
使用 az webapp ssh 命令。
如果您未經過驗證,則必須向您的 Azure 訂用帳戶進行驗證才能連線。 經過驗證後,您會看到瀏覽器中的殼層,您可以在其中執行您容器內的命令。
附註
您在目錄外部 /home 所做的任何變更會儲存在容器本身,且不會在應用程式重新啟動之後保存。
若要從本機電腦開啟遠端 SSH 工作階段,請參閱從遠端殼層開啟 SSH 工作階段。
忽略記錄中的 robots933456 訊息
您可能會在容器記錄中看到下列訊息:
2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"
您可以放心地忽略此訊息。
/robots933456.txt 是一個虛擬的 URL 路徑。 App Service 利用它檢查容器是否能夠處理請求。 「404」錯誤回應表示該路徑不存在,並向 App Service 表示容器健康且準備回應請求。