文章出處

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能穩定一些。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()