這兩個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)
因而我重寫了該方法後,再次併發測試,終於再也不拋出該異常。
問題解決。