这两个bug都是查了挺久才查到的,随手记是个好习惯。linux
本机环境是win10 x64 测试环境是linux,.net core 2.0多线程
修改方案:并发
ValidCultureNames = CultureInfo.GetCultures(CultureTypes.AllCultures) .Where(t => !string.IsNullOrEmpty(t.Name)).Select(t => t.Name.ToLower()).ToList(); public override bool IsValid(object value) { var cultureInfo = value as string; if (string.IsNullOrEmpty(cultureInfo)) { ErrorMessage = ValidationError.CultureInfoIsNull.ToMultiLanguageString(); return false; } if (Q9LanguageExtendtions.ValidCultureNames.Contains(cultureInfo.ToLower())) { return true; } ErrorMessage = ValidationError.CultureInfoParseError.ToMultiLanguageString(); return false; }
源码分析过,抛错行应该是ide
protected string ErrorMessageString { get { this.SetupResourceAccessor(); return this._errorMessageResourceAccessor(); } }
中_errorMessageResourceAccessor = null致使的NullReferenceException。源码分析
修改方案:重写FormatErrorMessage测试
public override string FormatErrorMessage(string name) { return ErrorMessage; }
认真查了问题后发现:this
多个tryValidateObject方法在验证多个dto时,构造方法只调用了一次,即用的同一个实例,致使并发状况下会出现多处的ErrorMessage set时修改了Accessor为null。spa
解决方案:操作系统
从新阅读官方文档后发现:.net
1.官方文档上写的应重写IsValid(Object value)
2.可是源码中写的是重写protected override ValidationResult IsValid(object value, ValidationContext validationContext)
3.官方实例也是用的重写protected override ValidationResult IsValid(object value, ValidationContext validationContext)
因而我重写了该方法后,再次并发测试,终于再也不抛出该异常。
问题解决。