当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 ...
随机推荐
- iOS刨根问底-深入理解GCD
概述 做过iOS开发的同学相信对于GCD(Grand Central Dispatch)并不陌生,因为在平时多线程开发过程中GCD应该是使用最多的技术甚至它要比它的上层封装NSOperation还要常 ...
- CRLF injection 简单总结
CRLF injection 简单总结 简介 CRLF是"回车 + 换行"(\r\n)的简称,即我们都知道在HTTP协议中,HTTP Header与HTTP Body是用两个CRL ...
- Django框架08 /聚合查询、分组、F/Q查询、原生sql相关
Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 目录 Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 1. 聚合查询 2. 分组 3. F查询和Q查询 4. o ...
- A Broken Calculator 最详细的解题报告
题目来源:A Broken Calculator 题目如下(链接有可能无法访问): A Broken Calculator Time limit : 2sec / Stack limit : 256M ...
- OSCP Learning Notes - Post Exploitation(3)
Post-Exploit Password Attacks 1. Crack using the tool - john (Too slow in real world) Locate the roc ...
- Python 实现图像快速傅里叶变换和离散余弦变换
图像的正交变换在数字图像的处理与分析中起着很重要的作用,被广泛应用于图像增强.去噪.压缩编码等众多领域.本文手工实现了二维离散傅里叶变换和二维离散余弦变换算法,并在多个图像样本上进行测试,以探究二者的 ...
- layui 数据表格自带的导出Excel,身份证等E+/000问题解决
layui数据表格的工具栏自带导出Excel 会将身份证等 长整数的 自动变成E+并且 后面有000.从而导致数据不能完整导出. 解决方案: 1.先下载Excel的插件包.将压缩包内的两个js放到 l ...
- iframe子页面取父页面的变量问题
iframe包含的子页面,想获取父页面的变量,不能直接获取到. 但是子页面可以访问父页面的方法 window.parent.parentFunctionName(); 利用这一点,可以将父页面的变 ...
- 我把JVM的类加载器整理了一下
前言 之前去面试的时候面试官问了我关于关于JVM性能调优的问题,由于自己之前公司的项目里自己没有接触到JVM性能调优的相关问题(感觉这些都是公司架构师考虑的问题),所有面试官问的时候自己一脸懵逼, ...
- web自动化 -- 浏览器窗口切换
切换浏览器窗口 示例: from time import sleep from selenium import webdriver from selenium.webdriver.support.wa ...