[Heroku] 把 asp.net core app 推上 Heroku

[Heroku] 把 asp.net core app 推上 Heroku


2022/07/07
Cover Image for [Heroku] 把 asp.net core app 推上 Heroku

Heroku 是寫網頁程式的人幾乎都有用過的雲服務平台,它提供大量免費的時數讓你把一些簡單的 web app 放在上面運行。對於學生進行程式 demo 尤為好用,只要學會一點點 git 技術配上官方 CLI,你就可以把你的 web app 架在上面了。

但是 heroku 預設的 build pack 本身不支援 C# (asp.net / asp.net core)。這時有兩種解法可以解決

  1. 包在 docker 裡面用 container 跑
  2. 使用第三方 build pack

包 docker 這方法固然萬用,透過 docker 你能把專案丟在各個平台或機器都能使用,在近期版本的 Visual Studio,新建專案時也有選項問你要不要啟用 docker 支援。網路上也有很多教學,但我就是忘了勾,也懶得重建專案,所以我就用第二種方法啦。 (說那麼多就是一個字:懶

正文

安裝 build pack

這次使用的 build pack 是在 heroku 上查 asp.net core 有最多人安裝的 jincod 的版本

首先我們把 heroku 環境架好,在開專案時都有教學,照著做就對了

push 上去之後 heroku 應該會說它不認識這個語言,這時我們要把 build pack 指定上去

heroku buildpacks:set jincod/dotnetcore

這個 buildpack 使用的 .Net Core 跟 asp.net core 版本都會是官方最新穩定版 (撰寫的當下是使用 .Net Core 6.0)

完成後進設定頁看會長這樣,理論上到這裡就可以跑了,真的很簡單的。

這個 buildpack 會逐一尋找 asp.net 專案所在的資料夾,如果 repo 有多個專案,要在 heroku 環境變數設定 PROJECT_FILE and PROJECT_NAME (但應該不太會有這種狀況…吧?)

warn: Failed to determine the https port for redirect

打開 log (heroku logs) 可能會發現有一個 warn

雖然它沒什麼影響 (heroku 已經、也只提供 https,所以不用 redirect),但可以利用修改 Program.cs (或 Startup.cs,看 .net 版本) 把它去掉
修改這句

33
app.UseHttpsRedirection();

修改成

33
34
35
36
37
if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DYNO")))
{
Console.WriteLine("Use https redirection");
app.UseHttpsRedirection();
}

這樣本地端測試會用 redirect https 功能,但上 heroku 就不會了。