本文是在實踐工作中遇到的一些問題記錄,並給出是如何解決的,.net core已經升級到3.0版本了,其實在項目中很早就已經在使用.net core來開發后台接口了,正好有個網站項目,就使用了Razor Pages來開發,從體驗上來說,如果你熟悉Razor Pages的話,開發速度是非常快的,如果有趁手的框架,那就更是如虎添翼。
好了,閑話少說,接下來將遇到了這些雜亂的問題記錄如下:
網站目錄里面的_ViewImports.cshtml用途
_ViewImports.cshtml用於引入命名空間,引入后就可以在Razor Page頁面上使用。每個目錄(文件夾)都可以建一個 _ViewImports.cshtml 視圖,這樣當前目錄下的所有Razor Page頁面都可以除了可以使用根目錄的 _ViewImports.cshtml 引入的命名空間外,還可以使用當前目錄 _ViewImports.cshtml 引入的命名空間所有對象。有點繼承的意思。
部分視圖如何引入?
部分視圖是很有用的一個功能特性,您可以把它當成webform時代的用戶控件,在引入時,只需要通過如下代碼即可以了:
<partial name="~/Views/Folder/_PartialName.cshtml" />
登錄功能如果有記住密碼,如何實現?
使用Razor Page開發網站時,如果在您的登錄界面上有個記住用戶功能,用戶下次進來直接進入后台,不需要再次登錄。實現這個功能,簡單一點的方法就是使用cookie認證,在首次登錄成功后,給用戶頒發一個長期的cookie,代碼如下:
await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), new AuthenticationProperties { IsPersistent = true });
基於上面的記住用戶的功能,實現方式很多,以上代碼用於生產環境需要評估安全風險,但對於內部系統,可以這樣取巧實現;另外對於基於cookie的方式,還存在一個問題就是用戶如果設置了退出瀏覽器自動清空一切歷史記錄的話,此方法失效。
后台接口時間格式序列化問題
在編寫web api接口時,會遇到時間格式化的問題,如有的地方需要使用短時間格式(年-月-日,如2019-01-02),有的地方需要使用長時間格式(年-月-日 小時:分鍾:秒),即時間顯示需要具體到分鍾秒這種格式,如果您的框架統一處理了時間格式為短時間格式,那么遇到長時間格式問題,就需要單獨處理,序列化用得較多的組件就是 NewtonSoft.json,那么我們只需要自定義一個格式化時間的類,寫個自定義格式化時間的類,繼承自IsoDateTimeConverter,然后在對應的屬性上加上這個特性即可,如下代碼所示:
public class CustomizedDateTimeConverer : IsoDateTimeConverter { /// <summary> /// 構造函數 /// </summary> public CustomizedDateTimeConverer() : base() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; } /// <summary> /// 帶參構造函數 /// </summary> /// <param name="format"></param> public CustomizedDateTimeConverer(string format) : this() { DateTimeFormat = format; } }
接下來在Startup.cs里面配置一下,如下代碼所示:
services.AddJsonOptions(options => { CustomizedDateTimeConverer converer = new CustomizedDateTimeConverer(); options.SerializerSettings.Converters.Add(converer); });
然后需要使用到的dto對象或者實體對象,打上這個特性即可,如下所示:
[JsonConverter(typeof(CustomizedDateTimeConverer), “yyyy-MM-dd HH:mm:ss”)]
這樣就實現了對時間格式的靈活控制,在整個后台框架設置的輸出時間格式為短時間格式時,有需要的情況下,我們仍然可以根據業務需要設置長時間格式,或者其它格式化方式。
使用AutoMapper如何忽略部分屬性映射?
使用automapper進行對象映射時,可以減少您寫大量的賦值語句,當然你在項目中偷懶直接使用和數據庫表對應的那個實體,automapper就派不上用場了。使用automapper進行對象映射時,如果源對象和目標對象有些屬性不同,或者要忽略掉,如何總呢?答案其實很簡單,在對應的屬性上打上這個[Ignore]特性即可:
/// <summary> /// 列表集合 /// </summary> [Ignore] public int[] List { get; set; }
服務器可視化監控工具
項目上線后,需要對服務器進行監控,您不可能安排一個人天天守着服務器看,需要借助 Grafana 來搞定這個需求。
Grafana是一個跨平台的開源的度量分析和可視化工具,可以通過將采集的數據查詢然后可視化的展示,並及時通知運維人員。
具體的使用教程網上很多,不做介紹。