.NET Framework和 .Net Core实现不一致的API之 `EmailAddressAttribute`

释放双眼,带上耳机,听听看~!

.NET Framework和 .Net Core实现不一致的API之 EmailAddressAttribute

Intro

现在我们的类库项目大多是 NETStandard2.0 项目,但是 netstandard2.0 只是一个标准接口定义,具体的实现还是要看实际运行的框架,如 netfx47 或 netcoreapp2.1,可能在大部分情况下,对外表现是一致的,但是,某一些 API 可能会不一致,这里就开一篇文章收集我所遇到的表现不一致的API。

EmailAddressAttribute

这个 EmailAddressAttribute 是用来验证输入的邮箱地址是否合法,在 dotnetframework 下的实现是用一个很复杂正则表达式去验证的,而 dotnetcore 下的实现则比较简单,并没有使用正则表达式去验证,只是验证了输入是否包含而且仅包含一个“@”,并且“@”不是第一个字符也不是最后一个字符,具体可以参考下面的链接

.NET Framework和 .Net Core实现不一致的API之 `EmailAddressAttribute`

dotnet fx 472 使用的正则表达式如下(看到我就已经头晕了。。。):

const string pattern = @\"^((([a-z]|\\d|[!#\\$%&\'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&\'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$\";

需要注意的还有一点,就是上图中的 AppSettings.DisableRegEx,来看实现:

.NET Framework和 .Net Core实现不一致的API之 `EmailAddressAttribute`

可以看到默认是 false,然而从 net472 之后默认就会是 true,会表现出和 .netcore 一致的行为,然而我用的是 net471,于是就发现了不一致,,,从上面的截图可以看到我们也可以在 app.config/web.config 文件中设置 AppSettings 节点,设置 key 为 dataAnnotations:dataTypeAttribute:disableRegEx ,value 为 true 来禁用使用正则。

dotnet fx472 source

.NET Framework和 .Net Core实现不一致的API之 `EmailAddressAttribute`

dotnet core source

dotnet core 实现源码

Memo

如果你希望 EmailAddressAttribute 不修改配置就实现完全一致的行为,那么你可以升级 framework 到 net472 或者放弃使用这个,自己定义一个正则,使用 RegularExpressionAttribute,你可以用 [RegularExpression(@\"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$\")] 来代替 [EmailAddress],这个正则仅供参考,可以修改为适用自己的正则~~

给TA打赏
共{{data.count}}人
人已打赏
随笔日记

实例解析云计算的概念

2020-11-9 4:26:25

随笔日记

负载均衡实现之随机数

2020-11-9 4:26:27

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索