.NET Framework和 .Net Core实现不一致的API之 `EmailAddressAttribute`
2019-04-17 14:30
603 查看
.NET Framework和 .Net Core实现不一致的API之 EmailAddressAttribute
Intro
现在我们的类库项目大多是 NETStandard2.0 项目,但是 netstandard2.0 只是一个标准接口定义,具体的实现还是要看实际运行的框架,如 netfx47 或 netcoreapp2.1,可能在大部分情况下,对外表现是一致的,但是,某一些 API 可能会不一致,这里就开一篇文章收集我所遇到的表现不一致的API。
EmailAddressAttribute
这个
EmailAddressAttribute是用来验证输入的邮箱地址是否合法,在 dotnetframework 下的实现是用一个很复杂正则表达式去验证的,而 dotnetcore 下的实现则比较简单,并没有使用正则表达式去验证,只是验证了输入是否包含而且仅包含一个“@”,并且“@”不是第一个字符也不是最后一个字符,具体可以参考下面的链接
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,来看实现:
可以看到默认是 false,然而从 net472 之后默认就会是 true,会表现出和 .netcore 一致的行为,然而我用的是 net471,于是就发现了不一致,,,从上面的截图可以看到我们也可以在 app.config/web.config 文件中设置 AppSettings 节点,设置 key 为
dataAnnotations:dataTypeAttribute:disableRegEx,value 为
true来禁用使用正则。
dotnet core 实现源码
Memo
如果你希望
EmailAddressAttribute不修改配置就实现完全一致的行为,那么你可以升级 framework 到
net472或者放弃使用这个,自己定义一个正则,使用
RegularExpressionAttribute,你可以用
[RegularExpression(@"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$")]来代替
[EmailAddress],这个正则仅供参考,可以修改为适用自己的正则~~
相关文章推荐
- .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现
- .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制
- NET Core微服务之路:基于Ocelot的API网关Relay实现--RPC篇
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- .net core实践系列之短信服务-Api的SDK的实现与测试
- F5 Alias address和Alias port实现详解
- 微信红包接口API实现(php版)
- Unable to resolve host "api1.51zhenghao.cn": No address associated with hostname
- c++调用api实现获取修改屏幕分辨率
- 终于知道什么情况下需要实现.NET Core中的IOptions接口
- Go实现简单的RESTful_API
- 基于Google AJAX Language API的全文翻译Web Service实现
- 【Qt编程】基于Qt的词典开发系列<八>--用户登录及API调用的实现
- C#中通过API实现的打印类
- VB使用API实现串口通讯的异常问题
- AutoANT-基于注解实现API测试
- 我的权限系统设计实现MVC4 + WebAPI + EasyUI + Knockout(转)
- 用API实现串口异步读写
- 使用百度API实现实时公交线路查询及列表显示
- MOSS中实现通过发送Email将文档存入文档库