今天用ASP.NET Core重寫了我的博客站點,原來是基於ASP.NET 4.5開發的。重寫工做整體很順利,最後成功發佈到Ubunt+Nginx平臺上。效果以下:html
右邊的Header信息裏能夠看到已是Nginx(Ubuntu)了,雖然最後成功發佈了,可是過程當中遇到點坑,特來分享。linux
ASP.NET Core以前,你們都很熟悉HtmlHelper方法。可是到了ASP.NET Core後,一些方法已經不能使用了,取而代之的是全新的TagHelper。但今天我遇到的問題是@Html.Action()方法不能使用了,使用TagHelper專門重寫也很不方便。所幸ASP.NET Core有個全新的特性能夠替代此方法,這個特性就是ViewComponent。瀏覽器
原來舊的代碼是將分頁部件的請求放置到單獨的Controller中,經過@Html.Action()方法動態請求,以下:bash
public PartialViewResult RecentWorks() { var works = repository.Works.Where(w => w.IsEnable); return PartialView("MyWorksSummary", works); }
而使用ViewComponent特性的代碼以下:服務器
public class WorkComponent:ViewComponent { private IWorkRepository repository; public WorkComponent(IWorkRepository repo) { this.repository = repo; } public IViewComponentResult Invoke() { var works = repository.Works.Where(w => w.IsEnable); return View("MyWorksSummary", works); } }
其中Invoke方法會在View中用於調用,很容易理解。mvc
下面咱們來看下兩者調用方法的區別,首先舊的HtmlHelper方法調用以下:asp.net
<div class="col-md-12"> <!--最近做品--> @Html.Action("RecentWorks", "Work") </div>
而新的ViewComponent特性調用以下:網站
<div class="col-md-12"> <!--最近做品--> @await Component.InvokeAsync("WorkComponent") </div>
注意:ViewComponent組件的搜索路徑是/Views/{對應控制器}/Components/{組件名}/{目標View}。例如我是在HomeController的Index視圖中調用了ViewComponent組件,因此ASP.NET Core會在路徑/Views/Home/Components/WorkComponent/目錄下搜索用到的view視圖。this
我使用的服務器是Ubuntu 16.04 LTS,主要參考的文檔是微軟的發佈指南:https://docs.asp.net/en/latest/publishing/linuxproduction.html。spa
可是這部分有些坑爹,配置linux服務器的時間比寫代碼都長。
按照文章裏總結,其實步驟很少,並且我並不須要配置Https,因此步驟就更少了,以下:
僅僅就這兩步,可是第二布按照官方文檔就會出問題了。
總共兩個問題,第一個,若是咱們按照文檔配置玩Supervisor自動服務後,請求就會發現老是502錯誤.
然而當咱們本身使用dotnet xxx.dll指令運行ASP.NET Core網站後,經過瀏覽器卻能成功訪問到。
再查看了日誌文件後,會發現ASP.NET Core站點根本沒有啓動,執行指令出錯。以下:
研究和實驗了下面這段官方文檔裏提供的配置代碼後,發現其中command一欄指令就不對:
[program:hellomvc] command=bash /usr/bin/dotnet /var/aspnetcore/HelloMVC/HelloMVC.dll autostart=true autorestart=true stderr_logfile=/var/log/hellomvc.err.log stdout_logfile=/var/log/hellomvc.out.log environment=ASPNETCORE__ENVIRONMENT=Production user=www-data stopsignal=INT
使用bash /usr/bin/dotnet xxx/xxx/{你的dll路徑}根本就不能啓動ASP.NET Core程序,應替換爲以下命令纔有效:
command=dotnet /var/aspnetcore/HelloMVC/HelloMVC.dll
這時查看日誌就會發現程序被啓動了,Nginx返回的也再也不是502 Bad gateway錯誤了。
然而這時問題又來了,此時訪問會發現瀏覽器一片空白,請求返回結果都是404. 手動在目錄中運行ASP.NET Core程序仍然能夠正常在瀏覽器訪問到。
爲何有這個問題?我想了好久也沒有解決辦法,中間排除了權限問題和運行錯誤問題。重裝了Nginx和Supervisor都沒有做用,因此最後仍是回到了這段配置文件內容。
通過多方查閱,發現是配置文件中少指明一行關於directory的配置信息,在填入這段配置文本後,竟然就正常了。WTF,這個鍋要誰來背?正確的配置文件內容以下:
[program:hellomvc] command=bash /usr/bin/dotnet /var/aspnetcore/HelloMVC/HelloMVC.dll directory=/var/aspnetcore/HelloMVC/ autostart=true autorestart=true stderr_logfile=/var/log/hellomvc.err.log stdout_logfile=/var/log/hellomvc.out.log environment=ASPNETCORE__ENVIRONMENT=Production user=www-data stopsignal=INT
這些問題折騰了一下午,坑爹,我仍是以爲這個鍋要微軟來背。坑爹的官方文檔,但願本文能對你們有用。
最後我發佈到Linux後的博客運做良好,主頁地址以下:http://changwei.tech.