現在我們的類庫項目大多是 NETStandard2.0 項目,但是 netstandard2.0 只是一個標準介面定義,具體的實現還是要看實際運行的框架,如 netfx47 或 netcoreapp2.1,可能在大部分情況下,對外表現是一致的,但是,某一些 API 可能會不一致,這裡就開一篇文章收集... ...
.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]
,這個正則僅供參考,可以修改為適用自己的正則~~