您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么將站點從ASP.NET 5 RC1升級至ASP.NET Core 1.0”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
從 ASP.NET 5 到 ASP.NET Core 最大的變化,除了改名之外,就是用 dotnet cli(命令名是dotnet)取代了dnx。所以運行 ASP.NET Core 程序,首先要安裝 dotnet cli,我們是在 Ubuntu 服務器上用 apt-get install dotnet-nightly 命令安裝的。
運行 ASP.NET 5 程序的命令是 dnx restore + dnx web,運行 ASP.NET Core 程序的命令則變為 dotnet restore + dotnet run。dotnet 運行 ASP.NET 程序 與 dnx 有一個很大的不同,除了 project.json 與 Startup.cs 職位,還需要一個 Program.cs 。
用 dnx 運行 ASP.NET 5 程序,需要在 project.json 中配置相應的 command ,比如:
"commands":{ "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.Kestrel --server.urls http://*:8001" }
而在 ASP.NET Core 中,不再需要這個 command ,而是交由 Program.cs 負責,比如我們這個示例項目中所用的 Program.cs 代碼如下:
using System.IO;using Microsoft.AspNetCore.Hosting;using Microsoft.AspNetCore.Builder;namespace CNBlogs.AboutUs.Web { public class Program { public static void Main(string[] args) { var host = new WebHostBuilder() .UseServer("Microsoft.AspNetCore.Server.Kestrel") .UseUrls("http://*:8001") .UseApplicationBasePath(Directory.GetCurrentDirectory()) .UseDefaultConfiguration(args) .UseIISPlatformHandlerUrl() .UseStartup<Startup>() .Build(); host.Run(); } } }
從上面的代碼可以看出,ASP.NET Core 應用的啟動工作是由 WebHostBuilder(源碼)起頭的,但它不是主角,只是助手,準備一些啟動參數,最終把啟動工作交給了真正的主角 —— WebHost,如果你對 WebHost 怎么干活的感興趣,可以看它的 源碼 。
弄好 Program.cs 之后,接下來就是體力活 —— 改名。
EntityFrameworkCore.MicrosoftSqlServer 改為 Microsoft.EntityFrameworkCore.SqlServer
Microsoft.AspNet.Builder 改為 Microsoft.AspNetCore.Builder
Microsoft.Data.Entity 改為 Microsoft.EntityFrameworkCore
Microsoft.AspNet.Mvc 改為 Microsoft.AspNetCore.Mvc
Microsoft.AspNet.Html.Abstractions 改為 Microsoft.AspNetCore.Html
移除 Microsoft.Dnx.Runtime 命名空間
等等
完成“改名”體力活之后,接下來的工作最費周折最累人 —— 配置 project.json , 而且現在的 project.json 不支持注釋,調測配置變得更麻煩。
首先要在 project.json 中添加如下 emitEntryPoint 的配置,dnx 時期不加是可以的,現在可不行。
"compilationOptions": { "emitEntryPoint": true }
遇到的第一問題是 dotnet restore 時出現 not compatible with DNXCore,Version=v5.0 錯誤。。。后來通過在 project.json 中添加如下的配置解決了,但至今未能弄明白為什么加上看似這個不相關的配置能解決問題(或者只是表面地解決)。
"tools": { "dotnet-publish-iis": "1.0.0-*" }
遇到的第二個問題是 The dependency Ix-Async 1.2.5 does not support framework DNXCore,Version=v5.0 。這個問題與 Entity Framework 有關,只要在 project.json 的 dependencies 中去掉 "Microsoft.EntityFrameworkCore.SqlServer",問題就消失。后來參考 Entity Framework 的源代碼,在 project.json 中添加如下的配置才解決問題:
"netstandard1.3": { "imports": [ "dotnet5.4", "portable-net452+win81" ] }
接下來遇到的問題是 ASP.NET Core MVC 路由匹配問題 ,用 dotnet run 將站點運行起來后,訪問任何URL都出現404錯誤。這是一個讓人無從下手的問題,因為從 Startup.cs 中的代碼看,MVC的配置無任何問題。后來還是懷疑到可能是 project.json 的問題,于是與 dotnet-cli 的示例項目 cli-samples 中的 project.json 進行對比,試了試添加如下的配置,問題竟然奇跡般地解決了(這個配置當時沒有去進一步研究)。
{ "compilationOptions": { "preserveCompilationContext": true } }
最后一個問題最讓人無語,問題是 訪問ASP.NET Core MVC站點出錯:Could not load file or assembly 'Microsoft.Win32.Registry' 。不僅我們的項目有這個問題,而且 cli-samples 中的 HelloMvc 項目也有這個問題。問題發生在 Microsoft.AspNetCore.DataProtection 中,而且 DataProtectionServices.cs 中的確引用了 Microsoft.Win32.Registry,但是我們是在 Linux 上運行的,難道 Microsoft.AspNetCore.DataProtection 目前還不支持跨平臺?
整個升級進程就在這里卡住了,當我們正準備暫時放棄升級至 ASP.NET Core 1.0 的時候,昨天發現 cli-samples 中的 prject.json 更新了,然后試著運行了一下 HelloMvc 項目,問題竟然神奇地解決了。
原來在 dependecies 中刪除了 NETStandard.Library ,在 frameworks 中添加了 netstandardapp1.3 的配置。于是,照著這個修改了我們項目中的 project.json ,問題立馬解決,我們的.NET跨平臺之旅的示例站點 about.cnblogs.com 也就成功運行了起來,升級總算成功完成了。
分享一下這個示例項目中的三個文件:
project.json:
{ "compilationOptions": { "preserveCompilationContext": true, "emitEntryPoint": true }, "dependencies" : { "Microsoft.Extensions.Logging.Console": "1.0.0-*", "Microsoft.AspNetCore.IISPlatformHandler": "1.0.0-*", "Microsoft.AspNetCore.HttpOverrides": "1.0.0-*", "Microsoft.AspNetCore.Mvc": "1.0.0-*", "Microsoft.AspNetCore.StaticFiles": "1.0.0-*", "Microsoft.AspNetCore.Diagnostics": "1.0.0-*", "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-*", "System.Runtime.Serialization.Primitives": "4.1.0-*", "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0-*" }, "frameworks": { "netstandardapp1.3": { "dependencies": { "NETStandard.Library": "1.0.0-*" }, "imports": [ "dnxcore50", "portable-net45+win8" ] } }, "tools": { "dotnet-publish-iis": "1.0.0-*" } }
Startup.cs:
namespace CNBlogs.AboutUs.Web { public class Startup { public Startup(IApplicationEnvironment appEnv) { IConfigurationBuilder builder = new ConfigurationBuilder() .SetBasePath(appEnv.ApplicationBasePath) .AddJsonFile("config.json", false); Configuration = builder.Build(); } public IConfiguration Configuration { get; set; } public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(LogLevel.Debug); app.UseDeveloperExceptionPage(); app.UseMvcWithDefaultRoute(); app.UseStaticFiles(); app.UseRuntimeInfoPage(); } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddEntityFramework() .AddSqlServer() .AddDbContext<EfDbContext>(options => { options.UseSqlServer(Configuration["data:ConnectionString"]); }); services.AddTransient<ITabNavRepository, TabNavRepository>(); services.AddTransient<ITabNavService, TabNavService>(); } } }
NuGet.Config:
<configuration> <packageSources><clear /><add key="AspNetCI" value="https://www.myget.org/F/aspnetcidev/api/v3/index.json" /><add key="NuGet.org" value="https://api.nuget.org/v3/index.json" /> </packageSources></configuration>
“怎么將站點從ASP.NET 5 RC1升級至ASP.NET Core 1.0”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。