• .NET跨平台之旅:将示例站点从ASP.NET 5 Beta5升级至Beta7团队


    9月2日,微软发布了ASP.NET 5 Beta7(详见Announcing Availability of ASP.NET 5 Beta7)。其中最大的亮点是dnx已经可以完全基于CoreCLR运行,也就是在Mac/Linux上运行dnx无需再借助Mono,而之前必须安装Mono,才能运行dnu restore安装nuget包包。

    我们的ASP.NET 5跨平台示例站点 about.cnblogs.com 之前是跑在 ASP.NET 5 Beta5 上的(详见借助ASP.NET 5 Beta5的新特性显示CLR与操作系统信息)。2个月跑下来,最大的感受是Kestrel太不稳定了,几乎天天都会挂掉。

    今天我们决定将示例站点从ASP.NET 5 Beta5升级至Beta7,这篇博文主要分享的是升级操作步骤以及遇到的问题。

    这次我们将服务器操作系统从CentOS换成了Ubuntu。

    首先安装的是dnvm,安装步骤如下:

    • 安装curl
      apt-get install curl
    • 安装unzip
      apt-get install unzip
    • 安装dnvm
      curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh 
      | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh

    接下来是安装dnx:

    安装命令:

    # dnvm upgrade -r coreclr

    安装结果:

    Determining latest version
    Latest version is 1.0.0-beta7 
    Downloading dnx-coreclr-linux-x64.1.0.0-beta7 from https://www.nuget.org/api/v2
    Download: https://www.nuget.org/api/v2/package/dnx-coreclr-linux-x64/1.0.0-beta7
    ######################################################################## 100.0%
    Installing to /root/.dnx/runtimes/dnx-coreclr-linux-x64.1.0.0-beta7

    再接下来就是安装运行dnu restore命令所需的Linux库。

    •  apt-get install libunwind8 
    •  apt-get install libcurl3-dev 

    紧接着就开始用新版的dnx运行示例站点所在的ASP.NET 5项目。

    首先用dnu restore安装nuget包包,运行成功,结果如下:

    # dnu restore
    Microsoft .NET Development Utility CoreCLR-x64-1.0.0-beta7-15532
      GET https://api.nuget.org/v3/index.json
      OK https://api.nuget.org/v3/index.json 5354ms
    Restoring packages for /data/AboutUs/project.json
    ...
    Installed:
        256 package(s) to /root/.dnx/packages

    接下来就是用dnx命令运行站点,从Beta 7开始在当前目录运行不需要输入点号了,只需下面的命令:

    dnx kestrel

    运行站点首先遇到的错误:

    System.MissingMethodException: Method not found: 
    'Microsoft.Framework.Configuration.IConfiguration
     Microsoft.Framework.Configuration.IConfigurationBuilder.Build()'.
       at Microsoft.AspNet.Hosting.Program.Main(String[] args)

    这是由于kestrel包包改名了,由Kestrel改为了Microsoft.AspNet.Server.Kestrel,所以要在project.json中改一下。

    {
        "webroot": "wwwroot",
        "exclude": ["wwwroot"],
        "commands":{
            "kestrel": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:8001"
        },
        "dependencies":{
            "Microsoft.AspNet.Server.Kestrel": "1.0.0-*",
            "Microsoft.AspNet.Mvc": "6.0.0-*",
            "Microsoft.AspNet.StaticFiles": "1.0.0-*",
            "Microsoft.AspNet.Diagnostics": "1.0.0-*",
            "System.Runtime.Serialization.Primitives": "4.0.10-*"
        }
    }

    继续运行dnx kestrel,出现新的错误:

    /data/AboutUs/Extensions/HtmlHelperExtensions.cs(21,24): DNXCore,Version=v5.0 error CS0266: 
    Cannot implicitly convert type 'Microsoft.AspNet.Html.Abstractions.IHtmlContent' to 
    'Microsoft.AspNet.Mvc.Rendering.HtmlString'. 
    An explicit conversion exists (are you missing a cast?)

    这是由于新版的ASP.NET MVC中IHtmlHelper.Raw返回值的类型由HtmlString改为了IHtmlContent,所以要改一下错误中提到的扩展方法的返回值类型。

    public static class HtmlHelperExtensions
    {
        public static IHtmlContent TabLink(this IHtmlHelper htmlHelper, 
          string linkText, string linkUrl, string viewName)
        {
            //...
        }
    } 

    并且要添加一个命名空间——using Microsoft.AspNet.Html.Abstractions;

    继续运行,继续错误:

    Unable to load libuv. Make sure libuv is installed and available as libuv.so.1
       at Microsoft.AspNet.Server.Kestrel.Networking.Libuv.Load(String dllToLoad)

    这是由于Kestrel需要libuv才能运行,依次运行下面的命令安装libuv:

    apt-get install make automake libtool
    curl -sSL https://github.com/libuv/libuv/archive/v1.4.2.tar.gz | sudo tar zxfv - -C /usr/local/src
    cd /usr/local/src/libuv-1.4.2
    sh autogen.sh
    ./configure
    make
    make install
    rm -rf /usr/local/src/libuv-1.4.2 && cd ~/
    ldconfig

    安装好libuv之后,终于成功运行起了站点!

    # dnx kestrel
    Application started. Press Ctrl+C to shut down.

    但是用浏览器访问站点,却出现下面的错误:

    The type or namespace name 'Runtime' does not exist in the namespace 'Microsoft.Framework' (are you missing an assembly reference?)
    public Microsoft.Framework.Runtime.IRuntimeEnvironment env { get; private set; }

    这是发生在MVC视图中的错误,也是改名惹的祸,IRuntimeEnvironment所有的命名空间由原来的Microsoft.Framework.Runtime被改为了Microsoft.Dnx.Runtime,所以视图中要改为以下的代码 :

    @inject Microsoft.Dnx.Runtime.IRuntimeEnvironment env

    解决这个问题之后, 站点 about.cnblogs.com 能正常访问了,升级也就成功完成了!

    希望新版Kestrel能稳定一些。

  • 相关阅读:
    codeforces_Codeforces Round #541 (Div. 2)_abc
    小米 OJ 编程比赛 01 月常规赛_灯_找规律
    codeforces_A. Salem and Sticks_数组/暴力
    航班座位_hihocoder
    canvas
    你所必须知道的HTML
    表单及表单新增元素
    HTML5新增的结构元素
    jQuery菜单,导航与标签页
    JavaScript的DOM对象
  • 原文地址:https://www.cnblogs.com/cmt/p/4810796.html
Copyright © 2020-2023  润新知