標籤:
前言
58HouseSearch這個項目原本是基於ASP.NET MVC 4寫的,開發環境是Windows+VS2015,發布平台是linux+mono+jexus,這樣看來整個項目基本已經滿足跨平台的需求。
這樣一來,本來我是沒什麼動力去做遷移的,好好的東西閑著沒事幹才遷移呢。
不過,這不國慶了嗎?窮人不是在家窮遊天下嗎?所以…真的有點閑著沒事幹了。
遷移可行性探討
項目遷移前,我們還是先來討論一下遷移可行性。為嘛要進行可行性探討呢?原因是.NET CORE是一個跨平台的架構,和上一代的.NET存在不相容。
個人總結一下,遷移的主要的問題在於:代碼不相容、類庫不相容、嚴重依賴Windows API或者COM組件等。
代碼不相容
代碼不相容其實不算麻煩。畢竟代碼是活的,你我也是活的,不就是一個改字罷了。花點時間慢慢改,總是能搞掂的。
類庫不相容
要不就棄用,要不就找替代品。
嚴重依賴Windows API或者COM組件
額?找替代品,找不到可用替代品的話。放棄吧,這個項目別考慮遷移了。
這個故事告訴我們,做跨平台項目的時候,少點用系統API或者組建。
回到58HouseSearch項目上面。
這個項目的代碼基本都是我寫的,所以重寫代碼沒什麼問題。
依賴的類庫有下面幾個:
AngleSharp
Newtonsoft.Json
log4net
AngleSharp是用來解析HTML的類庫,用linq的方式來操作HTML,用起來實在爽快。
如果這貨在.net core上不能跑,我應該立馬放棄了。
不過,這個實在給力…
Newtonsoft.Json
在這個項目裡面主要是用來記錄PV資料的,非核心功能,可有可無。不過看了下nuget上的介紹,也是支援.net core的。
剩下log4net…嗯,並不支援log4net。不過這個就更加是非核心內容了,直接丟了。
PS:考慮後期加入Nlog替代log4net。
至於依賴Windows API之類的,在這個項目裡面基本沒有,所以略過…
準備工作
- Visual Studio Community 2015 with Update 3 – Free
- .NET Core SDK
- .NET Core
- .NET Core 1.0.1 - VS 2015 Tooling Preview 2
友情提示:
- Visual Studio Community 2015 with Update 3 下載鏡像來安裝。
錯誤操作如下:
正確開啟檔案:
安裝.NET Core SDK和.NET Core之後再安裝.NET Core 1.0.1 - VS 2015 Tooling Preview 2
安裝.NET Core 1.0.1 - VS 2015 Tooling Preview 2 這貨的可能會報錯0x80072f8a未指定的錯誤
解決方案見:
詳細見連結:安裝DotNetCore.1.0.1-VS2015Tools.Preview2.0.2出現0x80072f8a未指定的錯誤
上面都弄好之後,理論上在VS2O15-建立項目裡面可以看到ASP.NET CORE的模板了。如:
項目遷移建立空白ASP.NET CORE項目
建立好了之後如:
Nuget擷取引用
https://www.nuget.org/packages/AngleSharp/
https://www.nuget.org/packages/Newtonsoft.Json
添加Controllers檔案夾
然後把之前項目的Controllers拷貝過來,改掉命名空間,去掉無用代碼,添加相應引用。
添加Views檔案夾
本項目直接把之前項目的Views拷貝過來是完全沒有問題的。
靜態檔案處理
asp.net core MVC中的檔案結構和asp.net mvc的檔案結構略有不同。
asp.net core MVC在view中“IMG/Little/PaleGreen.png”對應的檔案對應於“項目路徑/webroot/IMG/Little/PaleGreen.png”;
而asp.net mvc中,對應路徑為“項目/IMG/Little/PaleGreen.png”。
因而,我們的所有靜態檔案都應該放到:webroot檔案夾下。
上面的都做完了之後,項目結構如下:
接下來就是改代碼了。
代碼遷移Startup.cs添加MVC
| 123456789101112131415161718192021222324252627282930313233343536 |
public class Startup{ // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { //添加MVC架構 services.AddMvc(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } //啟用靜態檔案中介軟體 app.UseStaticFiles(); //啟動MVC路由 app.UseMvcWithDefaultRoute(); //設定預設頁面 app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=House}/{action=Index}/{id?}"); }); }} |
改寫GetHTMLByURL方法
之前的方法:
.net core重寫了HttpWebRequest,變成了WebRequest,所以上面的代碼廢了。
重寫如下:
| 1234567891011121314151617181920212223 |
public static string GetHTMLByURL(string Url, string type = "UTF-8"){ try { Url = Url.ToLower(); System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url); // Get the response instance. System.Net.WebResponse wResp = wReq.GetResponseAsync().Result; System.IO.Stream respStream = wResp.GetResponseStream(); using (System.IO.StreamReader reader = new System.IO. StreamReader(respStream, Encoding.GetEncoding(type))) { return reader.ReadToEnd(); } } catch (System.Exception ex) { return string.Empty; } } |
改寫Controller代碼
嗯,換了命名空間,別的一句都沒改直接拉過來了…略過。
發布到ubuntu
Install for Ubuntu 14.04, 16.04 & Linux Mint 17
第一步
| 12345678910 |
//Ubuntu 14.04 / Linux Mint 17sudo sh -c ‘echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list‘sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893sudo apt-get update //Ubuntu 16.04sudo sh -c ‘echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list‘sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893sudo apt-get update |
第二步
| 1 |
sudo apt-get install dotnet-dev-1.0.0-preview2-003131 |
安裝好了之後,輸入 dotnet -v 應該能看到版本資訊,如:
這樣的下,一句完成了ubuntu 運行asp.net core的環境搭建了。
project.json裡面隱藏的坑dependencies
NET Core 1.0.1 - VS 2015 Tooling Preview 2模板的asp.net core 版本和ubuntu 的asp.net core 版本不一致。
根據微軟爸給的教程,我們在ubuntu上安裝的.NET Core 1.0.0,見。
然而我們建立項目的模板是.NET Core 1.0.1,見:
怎麼辦?要不升級ubuntu的asp.net core,要不降級。
由於沒找到.NET Core 1.0.1 ubuntu的安裝包,所以我選擇了降級到.NET Core 1.0.0.
其中需要把Microsoft.NETCore.App version 、Microsoft.AspNetCore.Server.Kestrel、Microsoft.AspNetCore.Mvc 這三個節點都改成“1.0.0”。如下:
| 1234567891011121314 |
"dependencies": { "Microsoft.NETCore.App": { "version": "1.0.1", "type": "platform" }, "Microsoft.AspNetCore.Diagnostics": "1.0.0", "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0", "Microsoft.AspNetCore.Server.Kestrel": "1.0.1", "Microsoft.Extensions.Logging.Console": "1.0.0", "Microsoft.AspNetCore.Mvc": "1.0.1", "Microsoft.AspNetCore.StaticFiles": "1.0.0", "Newtonsoft.Json": "9.0.1", "AngleSharp": "0.9.8.1"}, |
publishOptions
發布輸出包括Views檔案夾
| 1234567 |
"publishOptions": { "include": [ "wwwroot", "web.config", "Views" ]}, |
runtimes
runtimes 配置為模板運行平台。
詳細見連結:https://docs.nuget.org/ndocs/schema/project.json
| 1 |
"runtimes": { "ubuntu.14.04-x64": {} } |
上面都弄好之後,跑一下看,如:
| 123 |
dotnet restore dotnet run |
來個請求看看:
jexus轉寄/反向 Proxy
ASP.NET Core “完整發布,內建運行時” 到jexus
58HouseSearch項目遷移到asp.net core