ASP.NET Core重寫個人博客站點小結


今天用ASP.NET Core重寫了個人博客站點,原來是基於ASP.NET 4.5開發的。重寫工作總體很順利,最后成功發布到Ubunt+Nginx平台上。效果如下:

 

 

右邊的Header信息里可以看到已經是Nginx(Ubuntu)了,雖然最后成功發布了,但是過程中遇到點坑,特來分享。

 

HtmlHelper問題


 

ASP.NET Core之前,大家都很熟悉HtmlHelper方法。但是到了ASP.NET Core后,一些方法已經不能使用了,取而代之的是全新的TagHelper。但今天我遇到的問題是@Html.Action()方法不能使用了,使用TagHelper專門重寫也很不方便。所幸ASP.NET Core有個全新的特性可以替代此方法,這個特性就是ViewComponent。

原來舊的代碼是將分頁部件的請求放置到單獨的Controller中,通過@Html.Action()方法動態請求,如下:

 

 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中用於調用,很容易理解。

下面我們來看下二者調用方法的區別,首先舊的HtmlHelper方法調用如下:

 

 <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視圖。

 

Linux服務器配置問題


 

我使用的服務器是Ubuntu 16.04 LTS,主要參考的文檔是微軟的發布指南:https://docs.asp.net/en/latest/publishing/linuxproduction.html

但是這部分有些坑爹,配置linux服務器的時間比寫代碼都長。

按照文章里總結,其實步驟不多,而且我並不需要配置Https,所以步驟就更少了,如下:

  1. 配置Nginx服務
  2. 配置supervisor

僅僅就這兩步,但是第二布按照官方文檔就會出問題了。

總共兩個問題,第一個,如果我們按照文檔配置玩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.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM