继续上一篇

上一篇,从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 > ; }).ToList().FirstOrDefault();
if (ErrorsModel != null)
{
errorMessage = ErrorsModel.Errors[].ErrorMessage;
} context.Result = new JsonResult(new { status = -, msg = errorMessage });
return;
}
}
}

在ConfigureServices内的

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

运行起来测试一下

当asp.net core偶遇docker一(模型验证和Rabbitmq 三)的更多相关文章

  1. 当asp.net core偶遇docker一(模型验证和Rabbitmq 二)

    上一篇我们说到构建了一个Rabbitmq容器 现在我们说说如何在一个悄悄传输消息到队列 我们现在设计一个Rabbitmq发送消息部分的模块 先设计一个远程发送的接口 public interface ...

  2. 当asp.net core偶遇docker一(模型验证和Rabbitmq 一)

    比如我们有一些设计,依赖于某些软件,比如rabbitmq 当管理员功能,反复错误三五次之后,就发送一条消息到队列里去,我们又不希望对原先设计带来侵入式的改变业务 这个时候,我们就可以在模型验证里面加入 ...

  3. ASP.NET Core - 实现自定义WebApi模型验证

    Framework时代 在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 [HttpPost] public async Task<JsonResult> Sav ...

  4. ASP.NET Core 6.0 基于模型验证的数据验证

    1 前言 在程序中,需要进行数据验证的场景经常存在,且数据验证是有必要的.前端进行数据验证,主要是为了减少服务器请求压力,和提高用户体验:后端进行数据验证,主要是为了保证数据的正确性,保证系统的健壮性 ...

  5. 当asp.net core偶遇docker二(打造个人docker镜像)

    网络上的docker容器总有一些不尽人意的感觉,这个时候,就需要自己diy一个自用的. 比如我们想在163的mysql 5.7内diy一下,结果发现,这个不带vim,我想改造一个自用的mysql镜像, ...

  6. ASP.NET Core开发-Docker部署运行

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  7. 基于Microsoft Azure、ASP.NET Core和Docker的博客系统

    欢迎阅读daxnet的新博客:一个基于Microsoft Azure.ASP.NET Core和Docker的博客系统   2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客 ...

  8. .NET Core微服务之ASP.NET Core on Docker

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Docker极简介绍 1.1 总体介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.D ...

  9. [翻译] ASP.NET Core 利用 Docker、ElasticSearch、Kibana 来记录日志

    原文: Logging with ElasticSearch, Kibana, ASP.NET Core and Docker 一步一步指导您使用 ElasticSearch, Kibana, ASP ...

随机推荐

  1. How to use the functions of apply and call

    Although  apply and  call  can implement same function. However, there is a litter different between ...

  2. Quartz.Net系列(十四):详解Job中两大特性(DisallowConcurrentExecution、PersistJobDataAfterExecution)

    1.DisallowConcurrentExceution 从字面意思来看也就是不允许并发执行 简单的演示一下 [DisallowConcurrentExecution] public class T ...

  3. Hangfire实战(一)------Hangfire+SQL Server实现简单的任务调度

    Hangfire:一个开源的任务调度框架 开发环境:VS2017,SQL Server 2012,.NET Framework 4.5 项目类型:控制台应用程序 1.在vs的程序包控制台中为项目添加H ...

  4. 不会吧,有人用了两年Spring, 居然不知道包扫描是怎么实现的

    全栈的自我修养: 0004 Java 包扫描实现和应用(File篇) I may not be able to change the past, but I can learn from it. 我也 ...

  5. WPF在.NET 5 中的线路图

    WPF是用于构建Windows桌面应用程序的.NET Core UI框架.WPF的所属权最近已经移交给了我们的团队(Windows下开发生态系统和平台的团队).这种转变使跨UI框架(即WinUI和WP ...

  6. Go Pentester - HTTP Servers(1)

    HTTP Server Basics Use net/http package and useful third-party packages by building simple servers. ...

  7. Angular 的前世今生

    目录 序言 AngularJS 简介 Angular 2.0 的动机 现如今的 Angular Angular 的核心概念 参考 序言 Angular 一般意义上是指 Angular v2 及以上版本 ...

  8. Zuul原理

    @EnableZuulProxy和@EnableZuulServer @EnableZuulProxy和@EnableZuulServer通过实例化不同的Marker,走不同的AutoConfigur ...

  9. Winform开发中的困境及解决方案

    在我们开发各种应用的时候,都会碰到很多不同的问题,这些问题涉及架构.模块组合.界面处理.共同部分抽象等方面,我们这里以Winform开发为例,从系统模块化.界面组件选择.业务模块场景划分.界面基类和辅 ...

  10. 离线安装 docker

    1.基础环境 操作系统:CentOS 7.8 docker 版本:18.06.1 2.docker 下载 2.1 官方地址 https://download.docker.com/linux/stat ...