ASP.NET Core重写我的博客站点小结

今天用ASP.NET Core重写了我的博客站点,原来是基于ASP.NET 4.5开发的。重写工做整体很顺利,最后成功发布到Ubunt+Nginx平台上。效果以下:html

 

 

右边的Header信息里能够看到已是Nginx(Ubuntu)了,虽然最后成功发布了,可是过程当中遇到点坑,特来分享。linux

 

HtmlHelper问题


 

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

 

Linux服务器配置问题


 

我使用的服务器是Ubuntu 16.04 LTS,主要参考的文档是微软的发布指南:https://docs.asp.net/en/latest/publishing/linuxproduction.htmlspa

可是这部分有些坑爹,配置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.

 

相关文章
相关标签/搜索