使用AutoMapper自动映射

安装Nuget包 通过.Net CLI安装 dotnet add package AutoMapper.Extensions.Microsoft.DependencyInjection --version 8.1.0 该包会自动安装AutoMapper的依赖包。 配置AutoMapper 在Startup.cs的ConfigureServices方法中配置: services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //也可以如下指定项目: //services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.Location.Contains("ExampleSolution.Model"))); 接下来在ConfigureServices中添加: services.AddAutoMapperProfiles(Configuration); 然后为每个需要映射的类之间添加配置,如: public class ExmapleProfile : Profile { public ExmapleProfile() { //这里的映射方向是单向的,如不需要从ExmapleViewModel转Exmaple,则第二条就可以不用写 CreateMap<Exmaple, ExmapleViewModel>(); CreateMap<ExmapleViewModel, Exmaple>(); } } 使用 通过构造函数注入: private readonly IMapper _mapper; public ExmapleController(IMapper mapper) { _mapper = mapper; } 使用: public ActionResult ExmapleMethod() { ...... Exmaple entity = new Exmaple(); ExmapleViewModel entityVM = _mapper.Map<ExmapleViewModel>(entity); ...... }

January 15, 2021 · 1 分钟 · Remo

vuex-electron使用的小坑

最近使用的electron-vue框架中,自带了vuex-electron模块。本来照着vuex官方文档写的,结果发现this.$store.dispatch(‘example’)无效,根本无法调用成功。 经过反复被坑与Google+Baidu,终于发现vuex-electron这个模块引入了两个插件: plugins: [ createPersistedState(), createSharedMutations() ] 其中createSharedMutations这个插件用于进程间共享数据,因此还需要经过一点小小的调整。目前大概有两种方案: 1.推荐:在electron的主进程的index.js中引入store: import store from '../renderer/store' (以上import路径仅针对electron-vue的默认结构,具体路径请自行调整) 2.如果不需要共享数据,也可以放弃这个插件,在store/index.js中把createSharedMutations插件的引用给去掉即可。

November 9, 2020 · 1 分钟 · Remo

正则表达式之零宽断言

引用自百度百科:零宽断言是正则表达式中的一种方法,正则表达式在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。 通常我们按照一定规则通过正则表达式匹配一段字符串的时候,我们给出的规则文本也会包含在内,比如以下这个例子,我们要匹配出被“#~”和“~#”包裹的文本: var reg = "#~.*?~#"; var text = "这是一段#~测试~#文字,用来测试#~正则表达式~#。"; var matches = Regex.Matches(text.reg); foreach (Match match in matches) { Console.WriteLine(match); } Console.ReadKey(); 运行以上C#代码,我们将会看到输出的是: #~测试~# #~正则表达式~# 但是有些时候,我们不希望规则文本出现在结果之中。这时候我们就需要用上“零宽断言”了。我们只需稍稍修改一下正则的代码: var reg = "(?<=#~).*?(?=~#)"; 其他代码不变,此时输出的就是: 测试 正则表达式 这里用上的(?<=表达式)和(?=表达式)就是零宽断言中的两种形式,前者称为“零宽度正回顾后发断言”,后者称为“零宽度正预测先行断言”。 以上面的代码为例,零宽度正预测先行断言(即(?=表达式))的规则是先从给出的文本中找到第一个“~#”,然后再回过头看看“~#”前面的文本是否符合“.*”这个规则,如果符合则进行匹配,不符合则查找下一个“~#”,然后再重复以上步骤。 零宽度正回顾后发断言(即(?<=表达式))则正好相反,它是先从要匹配的字符串中的最左端找到“#~”,然后看后面的文本是否符合“.*”这个规则,如果是则匹配,如果不是再去找第二个。 当然,还有“负向零宽后发断言(?<!表达式)”和“负向零宽先行断言 (?!表达式)”两种,这两种是找到第一个不匹配表达式的,然后再去做相应判断。 注意,在Javascript中,不支持后发断言,但是在Chrome浏览器中可以正常使用后发断言,这点需要注意一下,否则在Chrome中测试通过的代码,可能换了FireFox就不行了。

March 17, 2018 · 1 分钟 · Remo

利用GIf89a标记伪装为图片文件

昨天说到利用C#代码来判断上传文件的真实格式,以免别有用心者通过修改后缀名的手段来上传木马。 不过,在实际运用过程中,发现该方法无法防范利用“GIf89a”标记伪装为图片文件这种手段。只需在asp文件头部加上“GIF89a”这6个字符,即可让上述代码将文件判定为GIF文件,从而进行上传。 目前尚未找到较好的方式来排除这种伪装手段,只能暂时禁止了所有的gif上传,安全为先。*

January 9, 2017 · 1 分钟 · Remo

判断文件的真实格式

前段时间,公司的一台服务器遭到了入侵,被当成了肉鸡,攻击者上传了大量的挂马网页。初步判断是通过将asp文件伪装为图片文件后,通过上传漏洞,将木马文件上传到服务器。 针对这个问题,我们需要对文件的真实格式进行判断,而不仅仅是看一下后缀名。代码如下: static void Main(string[] args) { string path = @"C:\假图片.jpg"; System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read); System.IO.BinaryReader r = new System.IO.BinaryReader(fs); string bx = " "; byte buffer; try { buffer = r.ReadByte(); bx = buffer.ToString(); buffer = r.ReadByte(); bx += buffer.ToString(); } catch (Exception exc) { Console.WriteLine(exc.Message); } r.Close(); fs.Close(); //真实的文件类型 Console.WriteLine(bx); //文件名,包括格式 Console.WriteLine(System.IO.Path.GetFileName(path)); //文件名, 不包括格式 Console.WriteLine(System.IO.Path.GetFileNameWithoutExtension(path)); //文件格式 Console.WriteLine(System.IO.Path.GetExtension(path)); Console.ReadLine(); } 以上方法可以获得文件真实格式的编码,然后再通过编码与格式名的对应关系,即可获得文件的真实格式。以下是编码与后缀名对应的枚举类: public enum FileExtension { JPG = 255216, GIF = 7173, BMP = 6677, PNG = 13780, COM = 7790, EXE = 7790, DLL = 7790, RAR = 8297, ZIP = 8075, XML = 6063, HTML = 6033, ASPX = 239187, CS = 117115, JS = 119105, TXT = 210187, SQL = 255254, BAT = 64101, BTSEED = 10056, RDP = 255254, PSD = 5666, PDF = 3780, CHM = 7384, LOG = 70105, REG = 8269, HLP = 6395, DOC = 208207, XLS = 208207, DOCX = 208207, XLSX = 208207, } 在实际使用过程中我发现,DOCX格式的文件会被判断为ZIP格式,这是由于微软对DOCX格式的特性调整所致,而实际上,将DOCX文档后缀名改为ZIP之后,即可正常解压。因此在实际比对的时候,需要注意一下。

January 9, 2017 · 1 分钟 · Remo