.NET应用迁移到.NET Core--调查案例
上周已經發過三篇文章講述做.NET 應用遷移到.NET Core的一般方法,具體內容請看:
.NET應用遷移到.NET Core(一)
.NET應用遷移到.NET Core(二)風險評估
.NET應用遷移到.NET Core(三)從商業角度看移植過程
今天給大家展示一個真實的項目的調查案例,一個輕量級的.NET 工作流引擎移植到.NET Core平臺的調查案例,你也可以參照這篇案例進行遷移前的項目調查工作。
?
該調查問卷可以作為移植技術的一個指南,并且據此還可以提出其他一些問題。該問卷中的客戶指的是一個要移植到.NET Core的內部或外部部門。
平臺相關的內容
1、? 你當前的應用程序開發平臺是什么?
該問題是關于開發待移植.NET應用程序的開發平臺。這里不假設開發平臺和應用程序部署的平臺是相同的。這留在下一個問題中。
Windows 7 + IIS 7.5 + .NET Framework 4.5 +Redis 2.4 + SQL Server 2008 R2
2、? 該應用程序當前運行的平臺是什么?
移植工程師需要知道待移植的應用程序當前運行的平臺。
Windows 2008 R2 SP1 + IIS 7.5 + .NETFramework 4.5 + Redis 2.4 + SQL Server 2008 R2
3、? 除了開發平臺外,該應用程序是否還在其他平臺上部署過?如果部署過,它運行的平臺版本是什么?
問此問題可以讓你知道應用程序的可移植性,看它是否移植到其他平臺上。不過有一點需要注意:即使應用程序曾移植到其他平臺上,它的目標平臺可能也是比較老的版本。
沒有在其他平臺部署過。
4、? 描述應用程序使用的系統信息,以及需要的驅動程序在Linux平臺上是否可用。
確定Linux能夠滿足應用程序對平臺的依賴。
系統信息:
.NET Framework 對應的Linux平臺上有Mono 和 .NET Core兩大平臺
Redis 已經是在Linux平臺上運行
Web服務器 IIS 對應Linux平臺上有Jexus(Mono) 和 Apache/Nginx + Kestrel
SQL Server 在Linux平臺上存在但是還是預覽版,可以遷移到MySQL
Entity Framework 6.1 和 Entity Framework Core 本身就是跨平臺的,支持在Linux平臺上訪問SQL Server
ServiceStack.Redis 也是支持Mono和.NET Core
Owin 服務器在Linux 平臺上有Jexus 支持和 .NET Core的支持
ASP.NET Web API 2.2 Linux平臺上有Mono 4.6 支持,也可以遷移到.NET Core
Windows服務可以遷移到Linux 的后臺服務,可以Topshelf改造或者是遷移到.NET Core 控制臺應用,使用Linux系統服務或者是Supervisorctl 運行
站點使用的ASP.Net MVC 在Linux上Mono 4.6 支持,或者遷移到.NET Core
應用程序相關的內容
1、? 請詳細描述應用程序及其結構。
在這里,用戶可以描述應用程序的結構,并盡可能地包括結構圖。應用程序的所有組件都要描述。如果有的話,該問題也應該會讓你知道應用程序運行的框架。大部分的.NET應用程序運行在產品相關的框架上,例如IIS 、windows 服務和WCF服務。也就是說,需要你處理.NET Core可能不支持的某個具體的框架。
HRCommFlow應用包括2部分:對外的API服務和 Web站點。
對外服務的API 服務使用ASP.NETWeb API ,使用Windows服務自宿主。使用的組件如下:
應用框架 | 組件 | 備注 |
ASP.NET Web API | System.Web.Http | |
System.Web.Http.Owin | ||
Microsoft.Owin.Host.HttpListener | ||
EntityFramework | 訪問SQL Server | |
Newtonsoft.Json | Json | |
ServiceStack.Redis | 訪問Redis | |
Tencent.OA.Framework | 訪問組織機構信息 | |
ExpressionEvaluator | ||
System.ServiceProcess |
?
Web 站點使用ASP.NET MVC 4 ,使用IIS 宿主
應用框架 | 組件 | 備注 |
ASP.NET MVC | Microsoft.AspNet.Mvc | |
Microsoft.AspNet.Razor | ||
EntityFramework | 訪問SQL Server | |
Newtonsoft.Json | Json | |
Tencent.OA.Framework | 訪問組織機構信息 | |
ExpressionEvaluator | ||
System.ServiceProcess |
?
2、? 該應用程序有哪些不同組件?請給出各組件的名稱和版本號。
該問題讓你細分應用程序的結構,把應用程序細分成不同的組件。也就是說,可以把整個移植工作分成多個獨立的任務。
組件名稱 | 版本號 | 是否公開源代碼 |
System.Web.Http | 4.0.0.0 | 是 |
System.Web.Http.Owin | 5.2.3.0 | 是 |
Microsoft.Owin.Host.HttpListener | 3.0.0.0 | 是 |
EntityFramework | 6.1.3 | 是 |
Newtonsoft.Json | 6.0.8 | 是 |
ServiceStack.Redis | 3.9.71.0 | 是 |
Tencent.OA.Framework | 1.0.0.0 | 是 |
ExpressionEvaluator | 2.0.4.0 | 是 |
System.ServiceProcess | 4.0.0.0 | 是 |
Microsoft.AspNet.Mvc | 4.0.30506.0 | 是 |
Microsoft.AspNet.Razor | 2.0.30506.0 | 是 |
?
3、? 那些組件需要移植,那些不需要?請包含版本號。
客戶需要告訴你那些需要移植,那些不需要。
組件名稱 | 版本號 | 移植到Mono | 移植到.NET Core |
System.Web.Http | 4.0.0.0 | 不需要 | 不需要 |
System.Web.Http.Owin | 5.2.3.0 | 不需要 | 不需要 |
Microsoft.Owin.Host.HttpListener | 3.0.0.0 | 不需要 | 不需要 |
EntityFramework | 6.1.3 | 不需要 | 不需要 |
Newtonsoft.Json | 6.0.8 | 不需要 | 不需要 |
ServiceStack.Redis | 3.9.71.0 | 不需要 | 不需要 |
Tencent.OA.Framework | 1.0.0.0 | 需要 | 需要 |
ExpressionEvaluator | 2.0.4.0 | 需要 | 需要 |
System.ServiceProcess | 4.0.0.0 | 不需要 | 不需要 |
Microsoft.AspNet.Mvc | 4.0.30506.0 | 不需要 | 不需要 |
Microsoft.AspNet.Razor | 2.0.30506.0 | 不需要 | 不需要 |
?
4、? 待移植的應用百分之多少是用下列編程語言編寫?
Java
C#
F#
C
C++
匯編語言
Visual Basic
IronPython/IronRuby
Powershell
通過詢問應用程序使用了什么語言及其所占的比重,來確定應用程序的復雜度。
100% 使用C# 語言編寫
5、? 粗略估計一下各語言所占的代碼行數。
這是對問題4的另外一種問法,從不同的角度提出問題,常常能找到互相矛盾的地方,這就需要公開討論,從而能夠把項目調查清楚。
代碼數量大概是3500 行。
?
6、? 對于.NET應用程序:使用了P/Invoke來鏈接特有的庫了嗎?請描述之。
明確待移植的應用程序的復雜度。多數情況下,非100%純.NET編寫的應用程序,都需要平臺相關的例程,這些例程只能用固有的語言來處理,例如C語言。請注意這些平臺相關的代碼,往往它需要花費較多的時間來移植。
沒有
7、? 應用程序用了操作系統內核模塊了嗎?如果有,請描述之。
明確待移植的應用程序的復雜度。如果應用程序使用的操作系統內核模塊和例程是不可移植的,就需要花費較多時間轉換成目標平臺上對應的例程。
沒有
8、? 該應用程序是2D/3D的圖形應用程序嗎?請描述之。
明確待移植的應用程序的復雜度。確認.NET Core上存在兼容的圖形工具和開發工具,無論是系統默認提供的或者是第三方發行商提供的。
沒有
9、? 應用程序使用了消息隊列、共享內存、信號或者信號量嗎?請描述之。
上述內容大部分能夠方便的移植到.NET Core上。需要確認移植到.NET Core后,能夠使原來期望的行為。
沒有
10、?????????????應用程序或其中的組件,是多線程的嗎?如果是,使用的是那種線程庫?應用程序依賴開發平臺特有的線程屬性嗎?
Linux支持多種線程庫,但是現在以及將來的Linux發行版中,符合標準的線程庫是NPTL(Native Posix Threads Library)實現。
組件沒有多線程,也沒有依賴開發平臺特有的線程屬性。
11、?????????????應用程序的某些操作提前假設某種特定的字節順序嗎?這在移植過程會成為問題嗎?
該問題是關于應用程序的“大小端”(Littleendian,Big endian)問題。大部分.NET移植到.NET Core的目標平臺都是Intel平臺,該平臺是小端的。也有可能要把.NET程序移植到RISC 類的大端平臺。假設具體的大小端代碼是不可移植的,并且如果移植不正確會導致不易察覺的錯誤。更糟糕的是,這些錯誤在移植時不會暴露出來,只會在系統測試的時候會突然出現問題,并且很難找到問題的根源。
沒有假設字節順序問題,.NET Framework幫助我們解決這個問題
12、?????????????開發平臺使用的是那種編譯器版本?
C# (什么版本?)
VB.NET(什么版本?)
F#(什么版本?)
平臺特有編譯器(Visual C++)
其他(請列出)
明確待移植的應用程序的復雜度。如果待移植的應用程序用的是C#/VB.NET或者F#編譯器,則移植到Linux上會簡單一些,因為.NET Core和.NET使用相同的編譯器。如果用了windows平臺特有編譯器編譯的應用程序,C++應用程序比C程序較難移植,應用程序可能使用了C++特性,例如模板。因為C++標準在不同廠商的編譯器上實現不同,移植這種類型的代碼比簡單的C/C++代碼要花費更多的時間。
使用C# 編寫的應用程序,.NET Core和.NET使用相同的編譯器,Mono也是兼容的編譯器。
13、?????????????除了開發環境,應用程序還依賴其他的調試工具嗎?例如內存泄漏調試器、性能分析工具、異常處理等。
這又回到了調查和分析依賴關系。Linux上可能有,也可能沒有所需的第三方工具,這需要調查。誰提供許可?誰負責獲取這些工具?如果需要第三方支持,誰來提供支持?
沒有依賴其他的調試工具。
14、?????????????該應用程序是基于Socket的嗎?如果是,它使用了RPC嗎?請描述之。
雖然Linux支持標準的socket和RPC語義,但該問題的目的是確認程序的可移植性,比如.NET使用了WCF的RPC,.NET Core僅支持WCF的客戶端訪問,對于系統移植就很困難。問該問題可以搞清楚客戶是否在應用程序里實現了不可移植的結構。該問題也可以引出其他問題,例如在測試階段需要怎么樣的配置。
沒有使用RPC,使用的是HTTP Web API,依賴的組件Tencent.OA.Framework 依賴于WCF的客戶端訪問,需要移植到HTTP Web API 接口訪問。
15、?????????????應用程序使用了第三方軟件組件嗎(數據庫工具、應用程序服務器或其他中間件)?如果是,使用了哪些組件?
每一個第三方軟件組件都會增加移植的復雜度。如果使用了任何第三方組件,都需要詢問試了該組件的那個版本以及.NET Core上是否存在對應版本。第三方組件可能需要額外的時間去學習,甚至是配置或編譯。
應用程序使用了第三方組件,
組件名稱 | 版本號 | ?Mono是否存在對應版本 | .NET Core是否存在對應版本 |
System.Web.Http | 4.0.0.0 | 存在 | 存在 |
System.Web.Http.Owin | 5.2.3.0 | 存在 | 不存在 |
Microsoft.Owin.Host.HttpListener | 3.0.0.0 | 存在 | 不存在 |
EntityFramework | 6.1.3 | 存在 | 存在 |
Newtonsoft.Json | 6.0.8 | 存在 | 存在 |
ServiceStack.Redis | 3.9.71.0 | 存在 | 存在 |
Tencent.OA.Framework | 1.0.0.0 | 存在 | 不存在 |
ExpressionEvaluator | 2.0.4.0 | 存在 | 不存在 |
System.ServiceProcess | 4.0.0.0 | 存在 | 存在 |
Microsoft.AspNet.Mvc | 4.0.30506.0 | 存在 | 存在 |
Microsoft.AspNet.Razor | 2.0.30506.0 | 存在 | 存在 |
?
16、?????????????應用程序時如何交付和安裝的?使用標準的打包工具嗎?安裝腳本也需要移植嗎?
Linux上一個標準的打包工具是RPM。RPM會在其他章節講述。明確客戶是否需要移植應用程序打包部分的內容。
使用XPlat 模式,沒有使用打包工具,直接拷貝,部署運行。
17、?????????????應用程序或組件是64位的嗎?有組件需要移植成64位的嗎?
隨著64位平臺和操作系統的普及,該問題是要知道應用程序需要運行在什么體系結構的平臺上。通過現代的編譯器,大部分32為應用程序都可以輕松移植到64位環境上。需要考慮的一點就是移植和調試可能需要較長的時間。
應用程序都是64位的,不存在組件需要移植成64位。
數據庫內容
1、? 應用程序當前支持什么數據庫?請包括版本號。
現在幾乎所有的企業應用程序都需要后臺數據庫。確認應用程序所需的數據庫在Linux上可用非常重要。數據庫產品以及版本之間的差別會導致增加很多移植工作。
應用程序支持的SQLServer 2008 R2,目前在Linux上處于預覽版,需要移植到MySQL。
2、? 移植后的應用程序期望運行在什么數據庫上?
除了問題1外,客戶希望移植后的應用程序運行在Linux平臺的什么數據庫上?
希望移植后應用程序運行在Linux的MySQL 5.6上。
3、? 應用程序使用了非關系數據庫或私有數據庫嗎?
現在還有很多應用程序使用NoSQL數據庫,幸運的是大部分NoSQL數據庫都運行在Linux上。任何私有數據庫都需要移植到Linux上。確認運行數據庫的代碼在Linux上可用,這也是調查階段工作的一部分。
應用程序使用了NoSQL 數據庫Redis,Redis在Linux上運行良好。
4、? 應用程序是如何與數據庫通信的?
編程語言(例如C#,VB.NET等)
數據庫接口(例如ODBC,ADO.NET,Entity Framework)
確認所用的編程語言或接口在Linux上可用,確認是否由第三方廠商提供。
應用程序使用了Entity Framework 訪問SQL Server,微軟官方提供。
5、? 應用程序需要使用擴展的數據類型嗎(XML、audio,binary、video)?
這個問題主要用來評估移植小組需要具備的技能。
應用程序使用Json 數據類型。
項目移植時間進度內容
1、? 應用程序在目標平臺上的正式可用日期是那天?
該問題是要明確在制定移植進度計劃時,是否有商業目標需要考慮。
需要在2017年春節前上線運營。
?
2、? 應用程序在目標平臺上的移植工作已經開始了嗎?
這可以幫助評估在正式開始之前發現的復雜度問題。
沒有開始。
?
3、? 估計得移植復雜度是什么(低、中還是高)?
需要仔細分析對該問題的回答。現在很可能有一些新的因素在以前的移植經歷中沒有完全認識到。
?
移植復雜度適中,都是用C#語言編寫的應用組件,需要移植的第三方組件也比較少,而且都有源代碼。
?
4、? 在確定復雜度級別時,考慮了什么因素?
以前移植工作的任何信息都需要評估,并且與將來的Linux平臺移植工作進行對比。
?
?
5、? 該應用程序曾移植到其他平臺上嗎?用了多長時間?需要多少資源?遇到過什么問題?
該問題試圖把以前的移植工作和.NETCore移植進行比較。這只有在移植工程師的技術領導同時具有Windows平臺和Linux平臺移植經驗的情況下,才會有用。
沒有
?
6、? 你是怎樣粗略估計項目移植時間和所需資源的?
應用程序或某些部分可能曾移植到其他平臺上,知道向那些平臺移植所花的時間會有些幫助。從那些移植過程得出的經驗和教訓會派上用場。吸取這些教訓可以幫助你避免向.NET Core移植時重蹈覆轍。?
?
測試相關的內容
1、? 請描述接收測試的環境配置。
服務器配置 | 用途 | 環境 |
tLinux 2.2/CentOS 7.2 | API 服務器 | Mono 4.6/Jexus/.NET Core 1.1/Nginx |
tLinux 2.2/CentOS 7.2 | 數據庫服務器 | MySql 5.6+ |
tLinux 2.2/CentOS 7.2 | Redis服務器 | Redis 3.2 |
Windows Server 2008 R2 | 原API服務器/數據庫服務器 | SQL Server 2008R2 |
?
2、? 單元測試需要什么樣的網絡和數據庫配置?
?
3、? 移植測試需要多少時間和資源?
?
4、? 是否已經建立了測試腳本和性能度量標準?
?
5、? 需要運行一些基準測試來進行比較嗎?
?
6、? 性能數據在當前平臺上可用嗎?
?
7、? 最后執行性能測試是什么時間?
?
所有測試相關的問題都適用于軟件程序在Linux平臺上的測試。問這些問題還可以引出其他一些與移植測試腳本和測試工具有關的問題,而這些可能會增加整個項目的風險和時間。要重點關注客戶對問題1的回答。問題1和接收標準有關,這些標準需要各方在移植開始之前都同意。一個接收標準的例子是:模塊A和B應該通過測試用例c和d,并且沒有錯誤。當達到測試標準后,移植可以說是完成了,正式的QA測試接著就可以開始了。
項目移植的執行內容
1、? 根據你希望的情況,請選擇下面的一項或多項:
必要的話,將會給移植工程師提供一些技術幫助。
客戶負責獲取第三方工具許可和技術支持。
其他(請描述)。
可以在這里增加你認為需要客戶考慮的其他事項。有些問題可能是關于員工培訓或測試應用程序等。
?
2、? 項目需要什么硬件?
該問題是要確認是否會用到現有的硬件或額外的硬件,以用于移植、測試、培訓,以及必要的支持等。
?
盡管上述問卷已經比較全面,但是它不應該是調查所依賴的唯一基礎。調查還應該包括對應用程序源代碼的實際檢查。軟件程序的文檔也需要檢查,以便用戶能夠從中了解到需要的應用程序信息。
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
贊賞
人贊賞
總結
以上是生活随笔為你收集整理的.NET应用迁移到.NET Core--调查案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用 async amp; await
- 下一篇: asp.net ajax控件工具集 Au