环境

  • .NET Core 2.1

参考

步骤

具体的原理可见参考链接,总言之是通过IApplicationLifetime这个接口中的StopApplication()方法结束网站运行。

  1. IApplicationLifetime依赖注入
    private IApplicationLifetime applicationLifetime;
    
    public HomeController(IApplicationLifetime _applicationLifetime) {
        applicationLifetime = _applicationLifetime;
    }
  2. 定义一个Action,在其中调用StopApplication()方法,并返回一个空的Result
    [HttpGet("Shutdown")]
    public IActionResult Shutdown() {
        applicationLifetime.StopApplication();
        return new EmptyResult();
    }
  3. 开始调试,这里不选择IIS以方便查看效果
  4. 成功生成运行后会弹出控制台窗口,显示网站运行的一些信息
  5. 然后访问关闭网站Action的URL
  6. 访问后显示网站运行信息的控制台窗口会自动关闭,代表程序已经退出。
  7. 如果使用IIS代理网站,在网站自动关闭后再次访问URL(生成新的request),则网站会自动重启,达到访问URL来重启网站的效果。

网站通过cookie实现夜间模式——cookie mode字段值为sun时调整背景为白色,night时调整为黑色。

在调试中发现如果在下级目录设置mode值为night,回到上级目录后仍然显示白色背景,手动点击切换模式按钮后cookie中出现一个路径不同的mode字段。

原因是设置cookie时没有指定路径path,原setCookie代码:

function setCookie(name, value) {
    var Days = 1;
    var exp = new Date();
    exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
    document.cookie = name + "=" + value + ";expires=" + exp.toGMTString();
}

更正后:

function setCookie(name, value) {
    var Days = 1;
    var exp = new Date();
    exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
    document.cookie = name + "=" + value + ";expires=" + exp.toGMTString() + ";path=/";
}

这样指定路径后,在不同目录下设置cookie,其路径都为根目录。不管跳转到任何目录,读取的都为同一个cookie。

参考

最近才发现的一个问题,工程中有模型Member_MyInfo_ChgPwd_ViewModel,长这样:

其包含了另外两个模型,其中MemberMyInfoViewModel中有一个供DropDownList使用的List<SelectListItem>对象SexList,长这样:

在Controller代码中,有一名为ChgInfo的Action,长这样:还没有实现功能,一开始只是简单的return View(“MyInfo”),引发了空值异常,称没有将SexList实例化,此时才意识到是 return View() 处出了问题,于是换成 return RedirectToAction() 后异常消除。

如果 return View(),则不会生成新的request,仅加载页面的HTML,不会更改浏览器地址框中的URL——ChgInfo收到的由视图传来的Member_MyInfo_ChgPwd_ViewModel的实例form中的SexList并没有实例化,return View()后视图使用的仍然是没有SexList实例的Member_MyInfo_ChgPwd_ViewModel,引发空值异常。

如果 return RedirectToAction(), 则生成新的request,相当于人工访问一次页面——代码从MyInfo这个Action处开始执行,而Myinfo中由Controller传给View的Member_MyInfo_ChgPwd_ViewModel实例是真实new出来的,其SexList已经被实例化,不会引发空值异常。

这两者的区别可以类比python Flask框架中的return xxx()和return redirect(),详见 Python Web Flask框架学习(二) 中的重定向一节。