asp.net core 阿里云消息服务(Message Service,原MQS)发送接口的实现

最近在后台处理订单统计等相关功能用到了大力的mqs,由于官方没有实现asp.net core的sdk,这里简单实现了发送信息的功能,有兴趣的可以参考实现其他相关功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace Iyibank.Aliyun.MNS
{
public class MQHelper
{
private string url;
private string accessKeyId;
private string accessKeySecret;

private string host;
private string version = "2015-06-06";

public MQHelper(string url, string accessKeyId, string accessKeySecret)
{
this.url = url;
this.accessKeyId = accessKeyId;
this.accessKeySecret = accessKeySecret;

this.host = url.StartsWith("http://") ? url.Substring(7) : url;

}
/// <summary>
/// URL 中的 Key,Tag以及 POST Content-Type 没有任何的限制,只要确保Key 和 Tag 相同唯一即可
/// </summary>
/// <param name="tag"></param>
/// <param name="body"></param>
/// <returns></returns>
public async Task<bool> Pub(string name, string body)
{
try
{
using (HttpClient httpClient = new HttpClient())
{
Dictionary<string, string> headers = new Dictionary<string, string>();
headers.Add("Host", this.host);
headers.Add("Date", DateTime.Now.ToUniversalTime().ToString("r"));
headers.Add("x-mns-version", this.version);
headers["Content-Type"] = "text/xml";
string url = string.Format("{0}/{1}", name, "messages");
headers.Add("Authorization", this.authorization("POST", headers, string.Format("{0}", "/queues/" + name + "/messages")));

foreach (var kv in headers)
{
if (kv.Key != "Content-Type")
{
httpClient.DefaultRequestHeaders.Add(kv.Key, kv.Value);
}

}
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
StringBuilder sb = new StringBuilder();
sb.Append(" <Message> ");
sb.Append("<MessageBody>" + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(body)) + "</MessageBody> ");
sb.Append("<DelaySeconds>0</DelaySeconds> ");
sb.Append(" <Priority>1</Priority>");
sb.Append("</Message>");
HttpContent content = new StringContent(sb.ToString());
content.Headers.ContentType = new MediaTypeHeaderValue("text/xml");
httpClient.DefaultRequestHeaders.Connection.Add("keep-alive");
var res = await httpClient.PostAsync(this.url + "/" + string.Format("queues/{0}/{1}", name, "messages"), content);
if (res.StatusCode == System.Net.HttpStatusCode.Created)
{
return true;
}
return false;
}
}
catch { return false; }
}
/// <summary>
/// 生成验证信息
/// </summary>
/// <param name="method"></param>
/// <param name="headers"></param>
/// <param name="resource"></param>
/// <returns></returns>
private string authorization(string method, Dictionary<string, string> headers, string resource)
{
return string.Format("MNS {0}:{1}", this.accessKeyId, this.signature("POST", headers, resource));
}
/// <summary>
/// 签名
/// </summary>
/// <param name="method"></param>
/// <param name="headers"></param>
/// <param name="resource"></param>
/// <returns></returns>
private string signature(string method, Dictionary<string, string> headers, string resource)
{
List<string> toSign = new List<string>();
toSign.Add(method.ToString());
toSign.Add(headers.ContainsKey("Content-MD5") ? headers["Content-MD5"] : string.Empty);
toSign.Add(headers.ContainsKey("Content-Type") ? headers["Content-Type"] : string.Empty);
toSign.Add(headers.ContainsKey("Date") ? headers["Date"] : DateTime.Now.ToUniversalTime().ToString("r"));

foreach (KeyValuePair<string, string> header in headers.Where(kv => kv.Key.StartsWith("x-mns-")).OrderBy(kv => kv.Key))
{
toSign.Add(string.Format("{0}:{1}", header.Key, header.Value));
}

toSign.Add(resource);

HMACSHA1 hmac = new HMACSHA1(Encoding.UTF8.GetBytes(this.accessKeySecret));
string key = string.Join("\n", toSign);
var hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(string.Join("\n", toSign)));
return Convert.ToBase64String(hashBytes);
}
}
}

时间: 2024-10-10 04:33:14

asp.net core 阿里云消息服务(Message Service,原MQS)发送接口的实现的相关文章

阿里云容器服务与 ASP.NET Core 的 Docker 部署:用 docker secrets 保存 appsettings.Production.json

这是我们使用阿里云容器服务基于 docker 容器部署 asp.net core 应用遇到的另一个问题 —— 如果将包含敏感信息的应用配置文件 appsettings.Production.json 传递给运行在容器中的 asp.net core 应用. Docker 针对这样的应用场景已经提供了解决方案 —— Docker Secrets,对应的 docker 命令是 docker secret .我们就用 docker secrets 解决了这个问题,在这篇随笔中分享一下. 首先在阿里云容器

品尝阿里云容器服务:初步尝试ASP.NET Core Web API站点的Docker自动化部署

部署场景是这样的,我们基于 ASP.NET Core 2.0 Preview 1 开发了一个用于管理缓存的 Web API ,想通过阿里云容器服务基于 Docker 部署为内网服务. 在这篇博文中分享一下经过实践验证的操作步骤: 一.创建与配置集群 1)首先创建一个 Swarm Mode 的集群(注意创建时不要选择“自动创建负载均衡”,因为我们部署的是内网服务,自动创建的是公网负载均衡,需要手动创建内网负载均衡并绑定到集群): 2)集群创建成功后,会在集群列表中显示下面的信息: 3)接着创建一个

使用java实现阿里云消息队列简单封装

一.前言 最近公司有使用阿里云消息队列的需求,为了更加方便使用,本人用了几天时间将消息队列封装成api调用方式以方便内部系统的调用,现在已经完成,特此记录其中过程和使用到的相关技术,与君共勉. 现在阿里云提供了两种消息服务:mns服务和ons服务,其中我认为mns是简化版的ons,而且mns的消息消费需要自定义轮询策略的,相比之下,ons的发布与订阅模式功能更加强大(比如相对于mns,ons提供了消息追踪.日志.监控等功能),其api使用起来更加方便,而且听闻阿里内部以后不再对mns进行新的开发

15分钟在阿里云Kubernetes服务上快速建立Jenkins X Platform并运用GitOps管理应用发布

本文主要介绍如何在阿里云容器服务Kubernetes上快速安装部署Jenkins X Platform并结合demo实践演示GitOps的操作流程. 注意:本文中使用的jx工具.cloud-environments等做过改造用以适配阿里云Kubernetes容器服务,并未在自建Kubernetes集群中做过验证. 先决条件:首先,需要在 阿里云容器服务控制台 创建一个Kubernetes集群,本次实践使用的环境信息如下:master1 192.168.0.119master2 192.168.0

阿里云 Redis 服务遇到的问题

ERR unknown command eval 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: StackExchange.Redis.RedisServerException: ERR unknown command eval 源错误: 执行当前 Web 请求期间生成了未经处理的异常.可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息. 堆栈跟踪: [RedisServerExcep

用StackExchange.Redis客户端连接阿里云Redis服务遇到的问题

阿里云推荐的Redis服务.NET客户端是ServiceStack.Redis,但ServiceStack.Redis不支持异步,不支持.NET Core,于是尝试使用StackExchange.Redis.Microsoft.Extensions.Caching.Redis用的也是StackExchange.Redis,于是直接使用Microsoft.Extensions.Caching.Redis. 测试代码如下: var options = new RedisCacheOptions {

阿里云消息队列Kafka商业化:支持消息无缝迁移到云上

列Kafka彻底解决了开源产品稳定性不足的痛点,可用性达99.9%,数据可靠性99.999999%,并且支持消息无缝迁移到云上. 7月25日,阿里云宣布正式推出消息队列Kafka,全面融合开源生态.在兼容Apache生态的基础上,阿里云消息队列Kafka彻底解决了开源产品稳定性不足的痛点,可用性达99.9%,数据可靠性99.999999%,并且支持消息无缝迁移到云上. Kafka是一个分布式.高吞吐量.高可扩展性的消息队列服务,广泛用于日志收集.监控数据聚合.流式数据处理.在线和离线分析等大数据

ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF 框架服务 上一章节中我们了解了 Entity Framework 的基本工作原理和 DbContext ,我们也创建了一个自己的 HelloWorldDBContext. 本章节我们就来讲讲如何设置我们的 EF 框架来链接到 SQLite 数据库 配置 EF 框架服务 要让我们的 EF 框架的 DBContext 能够运行起来,我们需要更改一

Asp.Net Core使用SignalR进行服务间调用

原文:Asp.Net Core使用SignalR进行服务间调用 网上查询过很多关于ASP.NET core使用SignalR的简单例子,但是大部分都是简易聊天功能,今天心血来潮就搞了个使用SignalR进行服务间调用的简单DEMO. 至于SignalR是什么我就不多说了,微软官方文档也不少. 第一步新建项目 所有VS开发第一步都是新建一个解决方案哈,这里我就不多介绍如何新建项目啦~~ 开发环境,VS2017,.NET CORE 2.1 新建两个asp.net core项目 如此简单的操作大家都懂