当asp.net core偶遇docker一(模型验证和Rabbitmq 二)
上一篇我们说到构建了一个Rabbitmq容器
现在我们说说如何在一个悄悄传输消息到队列
我们现在设计一个Rabbitmq发送消息部分的模块
先设计一个远程发送的接口
public interface IRemoteSend
{
void Send(object entity);
}
写一个Rabbitmq配置实体
public class RabbitmqConfigura
{
public string Host { get; set; }
public int Port { get; set; }
public string User { get; set; }
public string Password { get; set; }
public string VirtualHost { get; set; }
}
写一个实现IRemoteSend的RabbitmqRemoteSend
public class RabbitmqRemoteSend : IRemoteSend
{
private RabbitmqConfigura Configura { get; }
public RabbitmqRemoteSend(IOptions<RabbitmqConfigura> options)
{
Configura = options.Value;
} public void Send(object entity)
{
throw new NotImplementedException();
}
}
我们再实现以下Send方法
public class RabbitmqRemoteSend : IRemoteSend
{
public int DelaySend { get; set; }
private RabbitmqConfigura Configura { get; }
public RabbitmqRemoteSend(IOptions<RabbitmqConfigura> options)
{
Configura = options.Value;
} public void Send(object entity)
{
var factory = new ConnectionFactory
{
HostName = Configura.Host,
Port = Configura.Port,
UserName = Configura.User,
Password = Configura.Password,
VirtualHost = Configura.VirtualHost, AutomaticRecoveryEnabled = true,
NetworkRecoveryInterval = TimeSpan.FromSeconds()
}; using (var connection = factory.CreateConnection())
{
var model = connection.CreateModel(); var type_name = entity.GetType();
var ExchangeName = type_name + ".exchange";
var RouteKeyName = type_name + ".input";
var QueueName = type_name + ".input"; model.ConfirmSelect();
model.ExchangeDeclare(ExchangeName, ExchangeType.Direct);
model.QueueDeclare(QueueName, false, false, false);
model.QueueBind(QueueName, ExchangeName, RouteKeyName); var args = new Dictionary<string, object>();
args.Add("x-message-ttl", DelaySend);
args.Add("x-dead-letter-exchange", ExchangeName);
args.Add("x-dead-letter-routing-key", QueueName);
model.QueueDeclare(QueueName + ".delay", false, false, false, args); var bytes = new byte[];
var props = model.CreateBasicProperties(); props.ContentType = "text/plain";
props.DeliveryMode = ;
model.BasicPublish(ExchangeName, RouteKeyName, props, bytes);
model.WaitForConfirms();
}
}
}
我们需要定义一个序列化的接口做数据编码
public interface IFormattor
{
byte[] SerializeObject(object entity);
}
写一个默认实现
public class JsonFormattor : IFormattor
{
public byte[] SerializeObject(object entity)
{
var jsonString = JsonConvert.SerializeObject(entity);
return Encoding.UTF8.GetBytes(jsonString);
}
}
再修改以下RabbitmqRemoteSend
public class RabbitmqRemoteSend : IRemoteSend
{
public int DelaySend { get; set; }
private RabbitmqConfigura Configura { get; }
private IFormattor Formattor { get; }
public RabbitmqRemoteSend(IOptions<RabbitmqConfigura> options, IFormattor formattor)
{
Configura = options.Value;
Formattor = formattor;
} public void Send<TEntity>(TEntity entity) where TEntity : class
{
var factory = new ConnectionFactory
{
HostName = Configura.Host,
Port = Configura.Port,
UserName = Configura.User,
Password = Configura.Password,
VirtualHost = Configura.VirtualHost, AutomaticRecoveryEnabled = true,
NetworkRecoveryInterval = TimeSpan.FromSeconds()
}; using (var connection = factory.CreateConnection())
{
var model = connection.CreateModel(); var type_name = entity.GetType().Name;
var ExchangeName = type_name + ".exchange";
var RouteKeyName = type_name + ".input";
var QueueName = type_name + ".input"; model.ConfirmSelect();
model.ExchangeDeclare(ExchangeName, ExchangeType.Direct);
model.QueueDeclare(QueueName, false, false, false);
model.QueueBind(QueueName, ExchangeName, RouteKeyName); var args = new Dictionary<string, object>();
args.Add("x-message-ttl", DelaySend);
args.Add("x-dead-letter-exchange", ExchangeName);
args.Add("x-dead-letter-routing-key", QueueName);
model.QueueDeclare(QueueName + ".delay", false, false, false, args); var bytes = Formattor.SerializeObject(entity);
var props = model.CreateBasicProperties(); props.ContentType = "text/plain";
props.DeliveryMode = ;
model.BasicPublish(ExchangeName, RouteKeyName, props, bytes);
model.WaitForConfirms();
}
}
}
我们加入asp.net core测试一下
在ConfigureServices内增加代码
#region Rabbitmq
services.Configure<RabbitmqConfigura>(p =>
{
p.User = "admin";
p.Password = "";
p.Host = "127.0.0.1";
});
services.AddScoped<IFormattor, JsonFormattor>();
services.AddScoped<IRemoteSend, RabbitmqRemoteSend>();
#endregion
在Configure增加代码
var scope = app.ApplicationServices.CreateScope();
var remoteSend = scope.ServiceProvider.GetRequiredService<IRemoteSend>();
remoteSend.Send(new User()
{
Name = "hello",
Account = "account"
});
这段代码是完全用来测试的
User实体对象
public class User
{
public string Name { get; set; }
public string Account { get; set; }
}
我们在看看Rabbitmq内
看看内容
当asp.net core偶遇docker一(模型验证和Rabbitmq 二)的更多相关文章
- 当asp.net core偶遇docker一(模型验证和Rabbitmq 三)
继续上一篇 上一篇,从core方式实现了一个Rabbitmq发送队列消息的接口,我们现在需要在模型验证里面加入验证失败就发送消息的部分 [AttributeUsage(AttributeTargets ...
- 当asp.net core偶遇docker一(模型验证和Rabbitmq 一)
比如我们有一些设计,依赖于某些软件,比如rabbitmq 当管理员功能,反复错误三五次之后,就发送一条消息到队列里去,我们又不希望对原先设计带来侵入式的改变业务 这个时候,我们就可以在模型验证里面加入 ...
- Asp.Net Core 使用Docker进行容器化部署(二)使用Nginx进行反向代理
上一篇介绍了Asp.Net 程序在Docker中的部署,这篇介绍使用Nginx对Docker的实例进行反向代理 一.修改Nginx配置文件 使用winscp链接Liunx服务器,在/ect/nginx ...
- ASP.NET Core - 实现自定义WebApi模型验证
Framework时代 在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 [HttpPost] public async Task<JsonResult> Sav ...
- ASP.NET Core 6.0 基于模型验证的数据验证
1 前言 在程序中,需要进行数据验证的场景经常存在,且数据验证是有必要的.前端进行数据验证,主要是为了减少服务器请求压力,和提高用户体验:后端进行数据验证,主要是为了保证数据的正确性,保证系统的健壮性 ...
- 当asp.net core偶遇docker二(打造个人docker镜像)
网络上的docker容器总有一些不尽人意的感觉,这个时候,就需要自己diy一个自用的. 比如我们想在163的mysql 5.7内diy一下,结果发现,这个不带vim,我想改造一个自用的mysql镜像, ...
- ASP.NET Core开发-Docker部署运行
ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...
- 基于Microsoft Azure、ASP.NET Core和Docker的博客系统
欢迎阅读daxnet的新博客:一个基于Microsoft Azure.ASP.NET Core和Docker的博客系统 2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客 ...
- .NET Core微服务之ASP.NET Core on Docker
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Docker极简介绍 1.1 总体介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.D ...
随机推荐
- Python语法的使用和简介
前言 Python的语法和其它编程语言的语法有所不同,编写Paython程序之前需要对语法有所了解,才能编写规范的Python程序. 输入输出 print() # 打印显示input() # 输入内容 ...
- Django初级之django简介
1.Django简介 Django是Python语言中的一个web框架,Python语言中主流的web框架有Django.Tornado.Flask 等多种.Django相较与其它WEB框架,其优势为 ...
- day31 反射,内置方法,元类
目录 一.反射 1 什么是反射 2 如何实现反射 二.内置方法 1 什么是内置方法 2 为什么要用内置方法 3 如何使用内置方法 3.1 str 3.2 del 三.元类 1 什么是元类 2 clas ...
- JS基础知识点(二)
== 与 === 对于 == 来说,如果对比双方的类型不一样的话,就会进行类型转换,就会进行如下判断流程: 1.首先会判断两者类型是否相同,相同则会进行严格相等比较=== 2.判断是否在对比null和 ...
- setTimeout还有第三个参数
今天才发现setTimeout还有第三个参数. for (var i = 0; i< 10; i++){ setTimeout((i) => { console.log(i); }, 10 ...
- sass-loader安装+Failed to resolve loader: sass-loader You may need to install it.解决方法
方式一: 通过 cnpm 安装node-sass cnpm install node-sass --save 方式二: 通过npm 安装 1.安装sass-loader npm install sas ...
- CRM开发系列
CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销售循环:新客户的 ...
- .NET 开源项目 StreamJsonRpc 介绍[下篇]
阅读本文大概需要 9 分钟. 大家好,这是 .NET 开源项目 StreamJsonRpc 介绍的最后一篇.上篇介绍了一些预备知识,包括 JSON-RPC 协议介绍,StreamJsonRpc 是一个 ...
- 什么?你正在学web自动化测试?那这些Selenium的基本操作你了解过吗?
在自动化测试中,我们都知道是通过定位元素来实现的,那么有时候我们定位元素定位不到是为什么呢? 1.页面出现了iframe 2.出现了新的窗口,没有实现句柄的切换 3.三种等待方式,没有选择其中之一来使 ...
- Ethical Hacking - GAINING ACCESS(17)
CLIENT SIDE ATTACKS - Backdooring exe' s Download an executable file first. VEIL - FRAMEWORK A backd ...