記.net 遇到的幾個bug

這兩個bug都是查了挺久才查到的,隨手記是個好習慣。linux

1.public static CultureInfo GetCultureInfo(string name); 方法,傳參錯誤時,某些操做系統環境會不拋異常。(用於ValidationAttribute校驗參數)

本機環境是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;
        }

 

 

2.public static bool TryValidateObject(object instance,ValidationContext validationContext,ICollection<ValidationResult> validationResults,bool validateAllProperties);方法在多線程下可能拋出NullReferenceException

源碼分析過,拋錯行應該是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)

 

因而我重寫了該方法後,再次併發測試,終於再也不拋出該異常。

問題解決。

相關文章
相關標籤/搜索