.net开发

谈谈EF Core是怎么将内插字符串转为参数化SQL查询的

小柊 发表于 2019年07月22日 00时45分42秒

序、扯淡

不要问笔者这消失的五月和六月,笔者不想谈……Endless work Limited life……

然后还在考虑一个问题,以后博客还是像以前一样一月一水呢,还是好好研究点技术,不定期发表。但总觉得后者会导致笔者进入无限鸽的状态,还是算了。

 

在文章的开始,我需要先提三个名词:Entity Framework、SQL注入和字符串插值。

浏览内容

C# 从byte[]里直接读取Structure

小柊 发表于 2019年02月28日 23时47分20秒

序、前言

emmmmm,首先这篇文章讲的不是用BinaryFormatter来进行结构体的二进制转换,说真的BinaryFormatter这个类其实现在的作用并不是特别大了,因为BinaryFormatter二进制序列化出来的结果只能用于.net平台,现在可能就用于如存入Redis这种情况下会在使用。

去年年尾的样子,我阅读学习某C++开发的程序源码时,发现作者用了一个很骚的操作直接将byte[]数组转为了结构体对象:

 

上面的data变量是一个指向unsigned char类型的指针,就只要一个简单的类型转换就可以将一堆unsigned char转换成想要的结构体,这着实有点让笔者有点羡慕。

后来,笔者想用C#开发一个流量分析程序,由于需要对IP报文进行仔细的特征提取,所以不能直接使用第三方数据包解析库(如:PacketDotNet)直接解析,会丢失部分特征,然而使用BinaryReader进行报文头解析的话,整个解析代码会写的丧心病狂的恶(e)心(xin),正在苦恼的时候,突然想起上面提到的那个骚操作时,笔者突然冒出了一个想法,C#里也支持结构体,那我能不能也像C++这样直接从字节序列中读取出结构体呢?

注:本文所有代码在.net Standard 2.0上测试通过。

浏览内容

C# 全局异常捕获(for .net Core)

小柊 发表于 2018年12月17日 23时42分04秒

序、背景

在16年,笔者曾在博客里写了一篇《C# 全局异常捕获》的文章,里面讲了一下如何在整个项目中捕获未处理的异常,只不过当时写的时候还是以.net Framework和Asp.net为目标写的。

然而这两年里整个.net的圈子发生了非常大的变化,比如16年刚发布的还不温不火的.net Core,终于在这两年间熊熊的燃烧起来,现在去Nuget上面看,这两年内更新过的项目,基本都提供了对.net Standard的支持,而曾经的.net Framework因为各种各样的历史包袱,开始显得有些力不从心,甚至在今年.net Framework第一次将被.net Standard甩下——.net Core3.0将首先支持.net Standard 2.1,而.net Framework 4.8则还会在.net Standard 2.0上停留(可以看微软的这篇博客《Announcing.NET Standard 2.1》)

今天半夜准备睡觉的时候,收到了一位朋友的留言,希望笔者能补充一下在.net Core下,全局异常捕获的方式。

 

所以今天决定赶一下,讲讲在新的.net Core平台下,如何进行全局异常捕获。

浏览内容

C#/Python Json序列化时控制字段顺序

小柊 发表于 2018年08月13日 22时39分49秒

一、背景

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

 

Json广泛的用于数据传输的时候(比如Web的前后端数据传输),对于这种场景我们不会刻意的去控制对象序列化后,Json字符串中的字段顺序。因为在这种场景下,我们的要求只是能用就好。但一些特殊的情况,例如需要对一个对象进行Json序列化,并对产生的Json字符串进行RSA签名,那就一定要控制Json字符串中的字段顺序了。因为如果不严格的控制字段顺序,明明是一样的对象会因为序列化后Json字符串中的字段顺序不一致,导致产生的签名结果不一致。

那么,在C#和Python里,有什么方法可以控制对象字段在Json序列化时的顺序呢?

浏览内容

C# 拓展方法

小柊 发表于 2018年07月31日 22时41分25秒

一、序

拓展方法是C# 3.0中添加的一个新特性,虽然C# 3.0的推出已经过去很久了,但我还是想把这个拓展方法单独提出来和大伙讲讲——因为它真的真的太棒了!

虽然C#的拓展方法可能在您日常开发中很少会需要自己去写拓展方法,但您在日常的开发工作中,一定会多多少少用到一些库提供的拓展方法,因为有很多库的功能就是基于拓展方法提供的,比如说像.net自带的System.Linq命名空间下,提供的一系列关于集合查询的方法,以及Polly中Policy的定义等也会使用到拓展方法。可见拓展方法已经深深的融入到我们的开发生活中。

浏览内容

C# 如何像Python一样使用推导式?

小柊 发表于 2018年05月01日 21时51分20秒

序、扯淡

现在我做.net这块并不多,因为现在上班的公司不用.net。为了混口饭吃,就转去做Python开发了。

我一直觉得换一门主力开发语言并不是一件非常困难的事情,因为我认为编程语言只是思想的一种具体表达方式,用于构成一个程序的肉身,而一个程序里最重要的灵魂,是具体的编程思想、算法和设计模式组成的。

所以我也是这么和身边的人这么“传教”的,虽说语言本身也很重要,但算法设计模式等等千万别落下,各个语言自带的语法糖其实都可以用代码实现,万变不离其宗。

 

扯得有些远了,这次的题目主要是因为有个学弟,在我转到Python之后,也跟着转到Python来了。有次谈天的时候我表示不希望他到时候C#半桶水叮当不说,到时候Python也是这样。C#除了国内的就业前景相比之下并不是特别好以外,就语言本身素质来说还是非常不错的,用了这么久的Python,貌似只有Python里的列表切片和负索引(例如-1表示列表倒数第一位元素)以外,没有C#做不到的。

然后这个学弟就给我举反例了:

 

当时因为算是上班时间摸鱼,所以就只是去翻了一下System.Linq命名空间下面的拓展方法,发现没有什么类似的拓展方法后,也就以为C#里的确没有这种写法,后来就没再去注意。

 

最近两天又突然记起这件事情,仔细琢磨了一下,发现自己当时怕是智障了:都想到去翻System.Linq命名空间了,怎么就想不起直接用LINQ呢?

浏览内容

Asp.net Core中使用GDI+绘图

小柊 发表于 2018年01月01日 00时00分03秒

一、扯淡

光阴荏苒,日月如梭。转眼2017年就这么过去了。在这2017年里本人遇见了很多人,遇到了很多事。如果要从其中挑出一件最遗憾的事情,那大概就是.net Core 2.0居然不支持System.Drawing命名空间。

浏览内容

C# Xml序列化Dictionary类

小柊 发表于 2017年09月16日 17时57分37秒

一、扯淡背景

本人一直有个习惯就是开发的时候把一些程序需要使用的后期可能会变动的配置做成Xml写到本地文件里,当每次程序启动的时候再读取出来,以免因为配置变动导致重新修改代码。

最近的一次更新调整中,需要在配置类中加入字典类Dictionary<TKey, TValue>。

结果不加不要紧,一加这个字典类,在序列化为Xml的时候直接抛出了异常:

浏览内容

Asp.net MVC 全局字符串参数过滤前后空白字符

小柊 发表于 2017年06月25日 21时15分27秒

序、扯淡

又是在不知不觉之中,一个月就这么过去了。这一个月里发生了挺多的事情,比如说大学毕业(虽然辣鸡学校扣了毕业证和学位证,最后只能申请延期毕业,这里的大学毕业仅仅是参加了毕业仪式罢了);工作一直不能稳定下来,现在的公司部门编制满了,如果需要转正就需要换部门,要么就直接换工作(我现在越来越偏向后者了);在这六月里,杭州也进入了梅雨季节,连绵不断的阴雨天气搞的整个人都没有心情和精神;拖欠辅导员的大学感悟一拖就是两个月,现在还在绝赞拖稿中……

唉……

 

一、背景

今天我们还是以一个案例切入,讲解一下Asp.net MVC中筛选器的实际使用。

空格这个东西真是让人又爱又恨,你说离了它不行,多了它也要出事儿。最近自己在开发自用的一套系统里,一次重置密码操作后,发现新密码怎么都登陆不上去,查了后台数据库,发现密码确实已经更新了,但具体密码被hash过了,看不到当时设置的新密码,后来突然想起现在的系统里已经布满了我的日志钩子,查了一下操作日志才发现当时提交新密码的时候手滑在密码最后加了一个空格……

为了在实际上线的时候不让用户发生这种问题,我们可以在使用参数前,先调用字符串参数的Trim()方法,去清除字符串变量前后的空字符串。不过随着项目越来越大,提交参数的地方越来越多,在每次使用参数前调用Trim()方法的做法明显不够优雅(我个人的编程优雅之道就是“用最少的代码做最多的事”)。那优雅的方法是怎么做的呢?

浏览内容

C# 正则表达式简单验证手机号码

小柊 发表于 2017年03月07日 23时39分41秒

老样子,废话少说一句话系列:

C#用下面的函数进行正则匹配:

 

现在很多时候,网站都会需要用户提供自己的手机号码。不过很多时候用户会选择随便输入11位数字,如果去在提交时不及时发现,可能到时候就是白白调用一次短信发送接口。如果可以,我们后台开发者更希望能在用户提交时发现明显不合法的手机号码,从而阻止提交保存。那该怎么做呢。

浏览内容