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);
}
}
}
asp.net core 阿里云消息服务(Message Service,原MQS)发送接口的实现的更多相关文章
- 阿里云容器服务与ASP.NET Core部署:用 docker secrets 保存 appsettings.Production.json
这是我们使用阿里云容器服务基于 docker 容器部署 asp.net core 应用遇到的另一个问题 —— 如果将包含敏感信息的应用配置文件 appsettings.Production.json ...
- 品尝阿里云容器服务:初步尝试ASP.NET Core Web API站点的Docker自动化部署
部署场景是这样的,我们基于 ASP.NET Core 2.0 Preview 1 开发了一个用于管理缓存的 Web API ,想通过阿里云容器服务基于 Docker 部署为内网服务. 在这篇博文中分享 ...
- Sping Boot入门到实战之实战篇(一):实现自定义Spring Boot Starter——阿里云消息队列服务Starter
在 Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置 这篇中,我们知道Spring Boot自动化配置的实现,主要由如下几部分完成: @EnableAutoConfigu ...
- 基于阿里云容器服务用docker容器运行ASP.NET 5示例程序
小试阿里云容器服务 之后,接下来有一个挡不住的小试冲动--用docker容器运行程序.首先想到的程序是 ASP.NET 5示例程序,于是参考msdn博客中的这篇博文 Running ASP.NET 5 ...
- 使用java实现阿里云消息队列简单封装
一.前言 最近公司有使用阿里云消息队列的需求,为了更加方便使用,本人用了几天时间将消息队列封装成api调用方式以方便内部系统的调用,现在已经完成,特此记录其中过程和使用到的相关技术,与君共勉. 现在阿 ...
- 15分钟在阿里云Kubernetes服务上快速建立Jenkins X Platform并运用GitOps管理应用发布
本文主要介绍如何在阿里云容器服务Kubernetes上快速安装部署Jenkins X Platform并结合demo实践演示GitOps的操作流程. 注意:本文中使用的jx工具.cloud-envir ...
- 用StackExchange.Redis客户端连接阿里云Redis服务遇到的问题
阿里云推荐的Redis服务.NET客户端是ServiceStack.Redis,但ServiceStack.Redis不支持异步,不支持.NET Core,于是尝试使用StackExchange.Re ...
- 阿里云 Redis 服务遇到的问题
ERR unknown command eval 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: St ...
- 在 ASP.NET Core 中执行租户服务
在 ASP.NET Core 中执行租户服务 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://gunna ...
随机推荐
- ILGenerator.Emit动态 MSIL编程(二)之基础
public sealed class ColorToArgb { /// <summary> /// 将十六进制转化为AGRB /// </summary> /// < ...
- jQuery的.html(),.text()和.val()的概述及使用
本节内容主要介绍的是如何使用jQuery中的.html(),.text()和.val()三种方法,用于读取,修改元素的html结构,元素的文本内容,以及表单元素的value值的方法.jQuery中为我 ...
- Node.js的循环与异步问题
(转自:http://bbs.tianya.cn/post-itinfo-280080-1.shtml) Node.js 的异步机制由事件和回调函数实现,一开始接触可能会感觉违反常规,但习惯 以后就会 ...
- XML编程知识点总结
DOM和SAX DOM的全称是Document Object Model,也即文档对象模型.基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合,应用程序挣是通过对这个对象模型的操作,来实 ...
- [Mongodb] Relica Set复制集集群简单搭建--持续更新
这里我们搭建一个没有访问控制,奇数个Set没有仲裁者的集群 1.三个配置文件添加 replication.replSetName:"Replica_test" 并启动三个实例2.连 ...
- JLINK通过JFLASH烧写bin文件报错处理方法
错误原因:烧写开始地址出错,打开BIN文件后弹出的设置开始地址不正确不能为0 解决措施:用J-FLASH LITE或者将开始地址设置成正确的地址(KEILMDK中IROM1的开始地址
- js运动框架之掉落的扑克牌(重心、弹起效果)
玩过电脑自带纸牌游戏的同志们应该都知道,游戏过关后扑克牌会依次从上空掉落,落下后又弹起,直至"滚出"屏幕. 效果如图: 这个案例的具体效果就是:点击开始运动,纸牌会从右上角掉 ...
- 【转】easyui $.message.alert 点击右上角的关闭按钮时,不执行定义的回调函数
今天發現這個問題 easyui $.message.alert 点击右上角的关闭按钮时,不执行定义的回调函数
- SQL判断某列中是否包含中文字符、英文字符、纯数字 (转)
一.包含中文字符 select * from 表名 where 列名 like '%[吖-座]%' 二.包含英文字符 select * from 表名 where 列名 like '%[a-z]%' ...
- 定位form光标行
In AX2009 if you call the research() method on a form passing true, the cursor position within a gri ...