1. 程式人生 > >當asp.net core偶遇docker一(模型驗證和Rabbitmq 三)

當asp.net core偶遇docker一(模型驗證和Rabbitmq 三)

繼續上一篇

上一篇,從core方式實現了一個Rabbitmq傳送佇列訊息的介面,我們現在需要在模型驗證裡面加入驗證失敗就傳送訊息的部分

    
[AttributeUsage(AttributeTargets.Class)]
public class ValidateBaseAttribute:ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
return ValidationResult.Success; } }

這個驗證特性打上之後,只要模型驗證就觸發

轉到 ValidationContext 裡面

在ValidateBaseAttribute內修改如下

   [AttributeUsage(AttributeTargets.Class)]
    public class ValidateBaseAttribute:ValidationAttribute
    {
        public Type Type { get; set; }
        public
string FunName { get; set; } public ValidateBaseAttribute() { } public ValidateBaseAttribute(Type type, string funName) { Type = type; FunName = funName; } private bool ExecuteMethod(Type type, string funName,object
value) { if (type == null || string.IsNullOrWhiteSpace(funName)) return false; try { var instance = Activator.CreateInstance(type); var method = type.GetMethod(funName); return (bool)method.Invoke(instance, new[] { value }); } catch { return false; } } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { var validate = ExecuteMethod(Type, FunName, value); if (validate) { var remoteSend = validationContext.GetService(typeof(IRemoteSend)) as IRemoteSend; if (remoteSend != null) { remoteSend.Send(value);
return new ValidationResult("驗證失敗"); } }
return ValidationResult.Success; } }

在預設的ValuesController內增加方法

        [HttpGet("Check")]
        public User Check([FromQuery]User user)
        {
            return user;
        }

我們修改以下User類

//增加一個驗證特性
[ValidateBase(typeof(ValidateClass), "IsValidateUser")]
    public class ValidateClass
    {
        public bool IsValidateUser(User user)
        {
            return user.Name.Equals("admin", StringComparison.InvariantCultureIgnoreCase) || user.Account.Equals("admin", StringComparison.InvariantCultureIgnoreCase);
        }
    }

只要使用者名稱或者賬號為admin

你以為這樣就完了?No,模型驗證要觸發,必須有一個模型驗證觸發的過濾器

    public class ModelFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (!context.ModelState.IsValid)
            {
                string errorMessage = string.Empty;
                var ErrorsModel = context.ModelState.Values.Where(item => { return item.Errors.Count > 0; }).ToList().FirstOrDefault();
                if (ErrorsModel != null)
                {
                    errorMessage = ErrorsModel.Errors[0].ErrorMessage;
                }

                context.Result = new JsonResult(new { status = -1, msg = errorMessage });
                return;
            }
        }
    }

在ConfigureServices內的

//services.AddMvc();
services.AddMvc(options => options.Filters.Add<ModelFilter>());

執行起來測試一下