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); } } }
转载于:https://www.cnblogs.com/zhangkjun/p/6143381.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/222978.html原文链接:https://javaforall.cn
相关文章
- ASP.NET Core 6框架揭秘实例演示[33]:异常处理高阶用法
- 《ASP.NET Core 6框架揭秘》勘误
- ASP.net Session原理「建议收藏」
- ASP.NET Core技术--Identity Server 4 基础
- 快速了解 ASP.NET Core Blazor
- 在 Asp.Net Core 中什么是认证和授权
- ASP.NET Core技术--使用客户端凭证保护API接口
- 【愚公系列】2023年02月 .NET CORE工具案例-ChatGPT和.NET Core应用的结合
- 【愚公系列】2023年02月 .NET CORE工具案例-Workflow-Core轻量级工作流引擎(简单使用)
- ASP.NET Core技术--使用用户密码保护API接口
- ASP.NET Core 6 RazorPages 开发项目实战教程
- SQL Server中调用C#类中的方法实例(使用.NET程序集)
- 发布ASP.NET Core程序到Linux生产环境详解编程语言
- .net利用MSSQL连接ASP.NET的办法探索(mssql 连接asp)
- asp.net的web服务MSSQL检测ASP.NET的Web服务——利用它构建更棒的站点(mssql检测基于)
- ASP驱动的Oracle数据库连接源码解析(asp连oracle源码)
- NET环境下 MySQL数据库应用实践(.net配合 mysql)
- asp.net下定制日期输出格式的代码
- asp.net下linkbutton的前后台使用方法
- asp.net关于==?:和if()else()条件判断等效例子
- asp.net运行原理详解
- 浅析ASP.NET安全性分析(加强asp.net1.1/2.0安全性)
- ASP.NET之自定义异步HTTP处理程序(图文教程)
- ASP.NET之自定义同步HTTP处理程序(图文教程)
- ASP.NET固定标题列与栏位的具体实现
- asp.net使用ODP即oracle连接方式的的防注入登录验证程序
- 三步将Asp.Net页面输出到EXCEL里
- asp.net中virtual和abstract的区别分析