2017年7月21日星期五

ASP.NET Core / CentOS / Apache 問題集

前天以為安裝好DotNET Core至CentOS,看到ASP.NET頁面,應該就可以專心進入開發程序。
但這兩天預到的問題實在太多,由Visual Studio本身對.NET Core的兼容性,.NET Core本身的問題,到Project設定,再到Apache等等問題,我都花了不少時間解決。
始終.NET Core還是很新的產品,Google後都很難找到實際解決方法,所以我把預到的問題和解決方法寫下來,希望幫到其他人。

開發環境可以參照我前天所寫的ASP.NET Core + CentOS 7 + Apache安裝攻略
Error 1 - The project has not been restored or restore failed - run `dotnet restore`
一次就出現4個Error Message:

Severity Code Description Project File Line Suppression State
Error 3. You may be trying to publish a library, which is not supported. Use `dotnet pack` to distribute libraries. SkinCV C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Common.Targets 262
Error 2. The project does not list one of 'win10-x64, win81-x64, win8-x64, win7-x64' in the 'runtimes' section. SkinCV C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Common.Targets 262
Error 1. The project has not been restored or restore failed - run `dotnet restore` SkinCV C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Common.Targets 262
Error Can not find runtime target for framework '.NETCoreApp,Version=v1.0' compatible with one of the target runtimes: 'win10-x64, win81-x64, win8-x64, win7-x64'. Possible causes: SkinCV C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Common.Targets 262

這個錯誤大多數出現在當你以Core 1.0.0開新Project後,做第一次Nuget Package更新到v1.0.1後,就會出現。
幸好這個問題已經在Github上有人報告issue #2442
解決方法是打開project.json,加上:
"runtimes": {
    "win10-x64": {},
    "win8-x64": {} 
},
之後找出"Microsoft.NETCore.App",修改為
"Microsoft.NETCore.App": {
    "version": "1.0.1",
    "type": "platform"
}
或者你會發現,在dependencies裡同樣都有"Microsoft.NETCore.App": "1.0.1",我自己就把這個刪除,但大家視乎情況而定。

2017年7月18日星期二

ASP.NET Core + CentOS 7 + Apache安裝攻略

作為一個經歷過ASP.NET初代到4.5版本的人,見到ASP.NET終於能夠誇平台是值得興奮的事。
雖然Mono早在好幾年前已經很成熟,而且相容度亦滿足一般使用,但始終不是官方支持,商業上實在很難說服團隊使用。
現在周圍的人都在應用Azure/AWS,甚至是Docker技術把虛擬機和程式封裝運作,ASP.NET MVC/Webforms只能在IIS上執行的確是很尷尬的局面。
Microsoft此舉絕對是明智決定,由一直面對著主流的PHP,Java/Spring,到近年在Start-up廣泛使用的Ruby on Rails或Python/Django,都是Cross-platform的。
所以DotNET Core的出現使ASP.NET不再邊緣化,終於名正言順在Linux/Mac上運行了。
我都來湊下熱鬧,嘗試設置一下DotNET Ready的Linux平台,過程中固然不會一直都順利,自己都是LINUX外行人,我使用CentOS的時候已經是大約6年前的CentOS 5,很多Command都忘記了。
所以我就把每一步Command的輸出,和自己遭遇到的問題解決辦法都寫下來,給自己和大家參考一下。


事前準備
我所採用的軟件版本如下:
  • CentOS Linux release 7.3.1611 (Core) 64Bit
  • Apache 2.4.6 (httpd.x86_64 0:2.4.6-45.el7.centos.4)
  • .NET Core 1.0.4

有幾個官方連結會用上的:
  1. CentOS Linux release 7.3.1611 (Core) 64Bit
  2. Set up a hosting environment for ASP.NET Core on Linux with Apache, and deploy to it
  3. .NET Core command-line interface (CLI) tools

頭兩個是必須的,第三個頁面讓你了解一下Linux下的DotNET CLI工作的命令。

首先我們依照第一個頁面的指示先把DotNET Core核心檔案安裝至Linux。
頁面上沒有提的事,就是我們安裝CentOS後,有兩件事我認為要做的。
1. 做一次系統軟件更新
2. 安裝VNC Server,畢竟我是來自Windows世界,有GUI操作資料夾或檔案,用GUI文字編輯軟件(GEdit)去編輯Apache Config檔會更容易,沒必要扮Geek用vi Editor吧...

Yum Update

***請確認是使用Root權限作SSH連線***

#確認CentOS版本
[root@localhost ~]# cat /etc/centos-release
#> CentOS Linux release 7.3.1611 (Core)
#更新一次系統軟件
[root@localhost ~]# yum update
#完成後,重啟系統
[root@localhost ~]# reboot

安裝VNC Server
#確認沒有安裝過VNCServer
[root@localhost ~]# which vncserver
#***Output***:
#> /usr/bin/which: no vncserver in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

#安裝Gnome Desktop
[root@localhost ~]# yum groupinstall "GNOME Desktop"

#完成後,安裝VNCServer
[root@localhost ~]# yum install tigervnc-server

#執行以下指令,檢查是否安裝完成
[root@localhost ~]# rpm -qa | grep tigervnc-server
#***Output***:
#> tigervnc-server-1.3.1-9.el7.x86_64
#> tigervnc-server-minimal-1.3.1-9.el7.x86_64

2017年6月20日星期二

ASP.NET MVC EntityFramework DataContext (*.edmx) 應該放在哪裡?

以前我做 Webforms Project的時候,很多時求個方便,都都直接在同一個Project下建立DBContext (*.edmx),之後就會在DAL或BLL層面直接利用。
當然還是有機會引起Class名稱上的混亂,但還是機會較微,因為即使要採用Entity,都會使用回EF輸出的POCO classes。

但MVC專案情況下就有所不同,大家都知道,除了DBContext之外,一般我們還會在Models下建立類同的POCO classes (或可叫做DTOs, Data Transfer Objects),而到了EF6,更可以用Code First做Reverse Engineer 快速建立POCOs。
至於原因可以看看這裡 - Entity Framework classes vs. POCO




上述兩者不止內容相似,名稱都可以是相似甚至一樣,如果跟Webforms專案時一樣放在同一個Project下,那麼問題就出現了。



因為很大機會程式會出現錯誤訊息:
Schema specified is not valid.
Errors:
The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'Address'.
Previously found CLR type 'NewMVC.Models.Address', newly found CLR type 'NewMVC.Database.Address'.

最簡單地說明原因是EF會忽略Namespace,而以Class Name做Table Mapping,更詳細的解釋,可以看看CodePlex上的回報。

解決方法就是以另一個Assembly去載入DBContext,換句話說,就是新建Class Library Project去把EntityFramework的DBContext跟本身的Models分離。

2017年3月26日星期日

Google Blogger終於有新Theme用了!

一度認為Google慢慢會放棄Blogger,始終有Google Reader的前科
回顧一下Blogger的問題,有用開Blogger都會知道,Blogger無論是的Frontend和Admin頁都跟不上時代,簡單如文章搜尋功能都一直都不精準,編輯文章沒有Version Control等等都是現今,
甚至可以說是早很多年CMS上應該有的基本功能,所以都習慣了,但求Google不會對Blogger開刀而已。