這次主要的出發點是測試從原本自己刻的http client換成refit來讓程式碼更簡潔
那就必須確保資料最後都一致
可能會有的問題例如datetime的轉換
那一開始我就重新從config取設定然後注入用
RestService.For<IGitHubApi>()
這樣的方式注入,然後用字串取得Interface
但是這樣重新注入就測不到本身設定有沒有問題,因為重新刻了
繼續閱讀 “.NET 整合測試 nUnit"這次主要的出發點是測試從原本自己刻的http client換成refit來讓程式碼更簡潔
那就必須確保資料最後都一致
可能會有的問題例如datetime的轉換
那一開始我就重新從config取設定然後注入用
RestService.For<IGitHubApi>()
這樣的方式注入,然後用字串取得Interface
但是這樣重新注入就測不到本身設定有沒有問題,因為重新刻了
繼續閱讀 “.NET 整合測試 nUnit"從一個全新的vue3專案開始 今天要放到IIS上面測
原本用一個很開心的Mapping給dynamic import的路徑 結果呢 燈燈
直接抓不到
那為甚麼呢 在打包的時候用的是rollup
他不能整個路徑都用變數 他有規範在Doc裡面 找到就解了
https://github.com/rollup/plugins/tree/master/packages/dynamic-import-vars#limitations
繼續閱讀 “[速寫] Vue3 + Vite的Dynamic import踩坑"在找如何在後端自動排程的時候 最簡單的就是IScheduler
多找幾篇之後有幾個選項 但其實就是主要看到的文件 跟 文章都偏向quartz 就直接用了
主要參考這一篇:https://dotblogs.com.tw/wasichris/2020/12/16/172524
官方文件:https://www.quartz-scheduler.net/
基本上的架構就是 scheduler & job
開job做為要做的工作注入
自動排程
他可以設定簡單的定時/定點、日曆等等
那我選用cronexpression來讓我決那些分鐘跑一次
切換頻率
因為更改一開始注入的job不可能,因為是用cronexpression注入singelton
所以我改為兩種不同頻率的job 一個預設暫停
我在這邊有改寫scheduler 增加一個叫做 run on start
在Task StartAsync裡面linq的時候增加run on start = true
然後就分別暫停/開啟相互切換job
不過遇到的問題就是切換的時候兩個都執行了 不過目前影響不大就先這樣
這次是要佈署一個tensorflow的影像辨識在目前的系統上,既有的方式是在.NET上面呼叫bat檔案 再執行py檔完成這件事情
這樣做主要有幾個問題
速度慢:在每一次的request都需要重新開啟py檔,代表都會重新import,尤其tensorflow本身就需要時間
Debug困難:因為所有的錯都無法讀到,在.NET這邊就只會timeout error
先前的開發使用了試誤法,把環境變數 conda的環境位置都設定在bat檔案裏面才能開
SET python_root=
SET miniconda_root=
SET PATH=
這些設定好之後才能順利執行
而這次由於Debug實在太麻煩,我就決定直接寫Flask API把他完成
在執行面很快就可以架好一個local host在windows server上面,但是問題是要如何正式佈署
就是在重開機等操作之後仍正常開啟
我試過了 本篇文章 是利用windows task manager自動執行bat
不過也是不好debug,於是我就看到了用Apache開Flask
於是 第一步是開啟Apache
下載好Apache (從Apache Lounge) 之後解壓縮到 C:\Apache24
執行裡面bin\httpd.exe 就會在 local host看到 it works的字樣代表成功
這裡第一個會遇到的問題就是 如果預設的80 port已經有開了什麼服務,就必須換一個port
在 conf資料夾裡面的 httpd.conf可以修改
然後接下來就是要開啟Flask
在想要的資料夾 這裡用C:\dev
我試過好像在太多層也會出一些問題
資料夾裡面就是 appname資料夾 裡面放 __init__.py; wsgi_scripts資料夾裡面放appname.wsgi
結論 windows就用IIS佈署好了
如果遇到通用套件,自己內部使用又不想放到外面,除了使用dll傳送檔案之外,自己架設一個nuget server就是可以使用的選項
那在看microsoft自己的官方nuget server的時候,發現是dotnet framework,github的星星數量也才幾百,多找了幾個之後,選用Baget Server
原本的nuget server的問題就是會遇到core NET 5 6等 target framework的時候就會跑不出來
https://loic-sharma.github.io/BaGet/
在我測試Baget的時候都沒有遇到問題
不過需要再研究是 他接到database做搜尋的方式
那目前有做出來的就是
針對不同的framework
<PropertyGroup>
<TargetFrameworks>
netstandard2.1;
netcoreapp2.1;
netcoreapp2.2;
netcoreapp3.0;
netcoreapp3.1;
net5.0;
net6.0;
</TargetFrameworks>
<Version>1.1.1</Version>
</PropertyGroup>
在不同的framework用不同的dependency
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
<Reference Include="System.Net" />
<PackageReference Include="Newtonsoft.Json" Version="6.0.5" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net5.0' ">
<Reference Include="System.Net.Http" />
<Reference Include="System.Threading.Tasks" />
<PackageReference Include="Newtonsoft.Json" Version="8.0.3" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
<Reference Include="System.Net.Http" />
<Reference Include="System.Threading.Tasks" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
在不同framework做不同的事情
public static string version()
{
#if NET5_0
return "5.0";
#elif NET6_0
return "6";
#elif NETCOREAPP2_1
return "21";
#else
return "else";
#endif
}
一個系統沒有LOG 就是一隻飄來飄去的金魚
有了log4net 這樣發展已久的工具就該善用
手上的系統原本有的就是用SQL自己寫了一個登入 如果登入就寫入
那 就打掉 用正式的套件吧
繼續閱讀 “Dotnet 加入log4net 並開始記錄"在用了預設的 identity之後 就會要加欄位了
原本的用法是有userstore/ usermanager rolestore rolemanager
以下是已經改好之後的設定
private UserStore<ApplicationUser> userStore;
private UserManager<ApplicationUser> userManager;
private RoleStore<ApplicationRole> roleStore;
private RoleManager<ApplicationRole> roleManager;
userStore = new UserStore<ApplicationUser>(applicationDbContext);
userManager = new UserManager<ApplicationUser>(userStore);
userManager.UserValidator = new UserValidator<ApplicationUser>(userManager) { AllowOnlyAlphanumericUserNames = false };
roleStore = new RoleStore<ApplicationRole>(applicationDbContext);
roleManager = new RoleManager<ApplicationRole>(roleStore);
繼續閱讀 “AspNet 新增user/role表格" 這次要做的是在webform裡面加上登入登出以及權限機制
有分成membership跟identity兩種
membership是在2.0導入 identity是在4.X導入
繼續閱讀 “Asp.NET 登入機制 membership & identity"註解寫的是 為什麼要這樣做 程式碼本身就說明了做了什麼
例如 因為這裡要先排除undefined才能開始
或是 先檢查工程編號格式是否正確
抑或是 當下的trade-off
因為某些困難點,只能先放技術債在這邊,如果真的要重構的時候再來做