本文是在实践工作中遇到的一些问题记录,并给出是如何解决的,.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是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知运维人员。
具体的使用教程网上很多,不做介绍。