.net对接阿里云CSB服务

public Response<string> Main(MonthPlanRequest request){string apiName = "MonthPlan", postData =   request.ToJson(); var result = ConnectCSB(apiName, postData);return InvokeResult.Fail<string>("访问成功");}
	/// <summary>/// 请求方式post,参数为json格式/// </summary>/// <param name="apiName">api名称</param>/// <param name="postData">发送的参数</param>/// <returns></returns>public static string ConnectCSB(string apiName, string postData){var resultStr = "";try{string ACCESS_KEY = System.Configuration.ConfigurationManager.AppSettings["ACCESS_KEY"].ToString();string SECRET_KEY = System.Configuration.ConfigurationManager.AppSettings["SECRET_KEY"].ToString();string CSBURL = System.Configuration.ConfigurationManager.AppSettings["CSBURL"].ToString();//签名时间戳long timeStamp = ToUnixTimeMilliseconds(DateTime.Now);//form表单提交的签名串生成示例string signature = sign(apiName, "1.0.0", timeStamp, ACCESS_KEY, SECRET_KEY, null, postData);Dictionary<string, string> headerDic = new Dictionary<string, string>();headerDic.Add("_api_access_key", ACCESS_KEY);//访问密钥headerDic.Add("_api_timestamp", timeStamp.ToString());//签名时间戳headerDic.Add("_api_name", apiName);  //需要调用的api名称headerDic.Add("_api_signature", signature);//签名headerDic.Add("_api_version", "1.0.0");//版本																	resultStr = GetResult(CSBURL, "application/json", "application/json;charset=utf-8", "POST", postData, headerDic);}catch (Exception e){ErpErrLog(e.Message, apiName);return "[{'IsSuccess': 'false','Msg':'" + e.Message + "'}]";}return resultStr;}
	public static long ToUnixTimeMilliseconds(DateTime nowTime){DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));// DateTime nowTime = DateTime.Now;long unixTime = (long)Math.Round((nowTime - startTime).TotalMilliseconds, MidpointRounding.AwayFromZero);return unixTime;}
/// <summary>/// 本方法生成http请求的csb签名值。/// 调用csb服务时,需要在httpheader中增加以下几个头信息:/// _api_name: csb服务名/// _api_version: csb服务版本号/// _api_access_key: csb上的凭证ak/// _api_timestamp: 时间戳/// _api_signature: 本方法返回的签名串/// </summary>/// <param name="apiName">csb服务名</param>/// <param name="apiVersion">csb服务版本号</param>/// <param name="timeStamp">时间戳</param>/// <param name="accessKey">csb上的凭证ak</param>/// <param name="secretKey">csb上凭证的sk</param>/// <param name="formParamDict">form表单提交的参数列表(各参数值是还未urlEncoding编码的原始业务参数值)。如果是form提交,请使用 Content-Type= application/x-www-form-urlencoded </param>/// <param name="body">非form表单方式提交的请求内容,目前没有参与签名计算</param>/// <returns>签名串。</returns>public static string sign(string apiName, string apiVersion, long timeStamp, string accessKey, string secretKey, Dictionary<string, object[]> formParamDict, object body){Dictionary<string, object[]> newDict = new Dictionary<string, object[]>();if (formParamDict != null){foreach (KeyValuePair<string, object[]> pair in formParamDict){newDict.Add(pair.Key, pair.Value.Select(v => { return HttpUtility.UrlEncode(v.ToString()); }).ToArray());}}//设置csb要求的头参数newDict.Add("_api_name", new String[] { apiName });newDict.Add("_api_version", new String[] { apiVersion });newDict.Add("_api_access_key", new String[] { accessKey });newDict.Add("_api_timestamp", new object[] { timeStamp });//对所有参数进行排序var sortedDict = getSortByASCII(newDict);StringBuilder builder = new StringBuilder();foreach (KeyValuePair<string, object[]> pair in sortedDict){foreach (object obj in pair.Value){builder.Append(string.Format("{0}={1}&", pair.Key, obj));}}string str = builder.ToString();if (str.EndsWith("&")){str = str.Substring(0, str.Length - 1); //去掉最后一个多余的 & 符号}System.Security.Cryptography.HMACSHA1 hmacsha = new System.Security.Cryptography.HMACSHA1{Key = Encoding.UTF8.GetBytes(secretKey)};byte[] bytes = Encoding.UTF8.GetBytes(str);return Convert.ToBase64String(hmacsha.ComputeHash(bytes));}
public static string GetResult(string url, string accept, string contentType, string requestType, string parms, Dictionary<string, string> headerDic = null){var result = string.Empty;try{Stopwatch stopWatch = new Stopwatch();stopWatch.Start();var myRequest = (HttpWebRequest)WebRequest.Create(url);myRequest.Timeout = 300000;//100秒超时时间较短,需要调整成为300秒if (!string.IsNullOrEmpty(accept)){myRequest.Accept = accept;}if (!string.IsNullOrEmpty(contentType)){myRequest.ContentType = contentType;}//   myRequest.Headers.Add(new HttpRequestHeader(),"123");myRequest.Method = requestType;if (myRequest.Method == "POST"){var reqStream = myRequest.GetRequestStream();var encoding = Encoding.GetEncoding("utf-8");var inData = encoding.GetBytes(parms);reqStream.Write(inData, 0, inData.Length);reqStream.Close();}if (headerDic != null){foreach (var h in headerDic){myRequest.Headers.Add(h.Key, h.Value);}}//发送post请求到服务器并读取服务器返回信息    var res = (HttpWebResponse)myRequest.GetResponse();if (res.StatusCode != HttpStatusCode.OK) return result;var receiveStream = res.GetResponseStream();var encode = Encoding.GetEncoding("utf-8");if (receiveStream != null){var readStream = new StreamReader(receiveStream, encode);var oResponseMessage = readStream.ReadToEnd();res.Close();readStream.Close();result = oResponseMessage;ErpResult re = JsonConvert.DeserializeObject(result, typeof(ErpResult)) as ErpResult;if (re.code.Equals("000000")){ return "[{'IsSuccess': 'true','Msg':'" + re.message + "'}]";}elsereturn "[{'IsSuccess': 'false','Msg':'" + re.message + "'}]";}stopWatch.Stop();}catch (Exception e){ErpErrLog(e.Message, headerDic["_api_name"].ToString());if (e is WebException && ((WebException)e).Status == WebExceptionStatus.ProtocolError){WebResponse errResp = ((WebException)e).Response;using (Stream respStream = errResp.GetResponseStream()){var readStream = new StreamReader(respStream, Encoding.GetEncoding("utf-8"));var strError = readStream.ReadToEnd();Console.Out.WriteLine(strError);// read the error response}}return "[{'IsSuccess': 'false','Msg':'"+e.Message+"'}]";}return "[{'IsSuccess': 'true','Msg':'" + result + "'}]";}
public static Dictionary<string, object[]> getSortByASCII(Dictionary<string, object[]> dict){var sortList = dict.ToList();//经过测试以下三种是正确的,会按照ASCII码排序sortList.Sort((x, y) =>{return string.CompareOrdinal(x.Key, y.Key);});sortList.Sort((x, y) =>{var r = string.Compare(x.Key, y.Key, StringComparison.Ordinal);return r;});Dictionary<string, object[]> sortDict = new Dictionary<string, object[]>();var keys = dict.Keys.ToArray();Array.Sort(keys, string.CompareOrdinal); //anforeach (var key in keys){sortDict.Add(key, dict[key]);}return sortDict;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/157624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程的概念

点击链接返回标题-> 什么是进程&#xff1f; 进程&#xff08;Process&#xff09;&#xff0c;是程序的基本执行实体。 在早期面向进程设计的计算机结构中&#xff0c;进程是程序的基本执行实体&#xff1b; 在当代面向线程设计的计算机结构中&#xff0c;进程是线程的容器…

求二叉树中指定节点所在的层数(可运行)

运行环境.cpp 我这里设置的是查字符e的层数&#xff0c;大家可以在main函数里改成自己想查的字符。&#xff08;输入的字符一定是自己树里有的&#xff09;。 如果没有输出结果&#xff0c;一定是建树错误&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

Maven环境配置

Maven环境配置 下载Maven 网址&#xff1a;https://maven.apache.org/download.cgi 如果你的系统是Windows的直接按照箭头指示下载即可 环境变量配置 配置环境变量&#xff1a;将 Maven 的安装目录添加到您的系统环境变量中。 右键点击“我的电脑”&#xff08;或“此电脑…

Startdrive中上传参数设置的具体方法和注意事项

Startdrive中上传参数设置的具体方法和注意事项 适用于配 SINAMICS S120、G130、G150、S150和MV(基于CU3x0-2的驱动器)和所有启动驱动器版本INAMICS G115D/G120/G120D/G120C/G120P/G110M(基于CU2x0-2的驱动器) 根据SINAMICS类型的不同,Startdrive中的Upload参数有所不同。…

leetcode刷题详解——粉刷房子

1. 题目链接&#xff1a;LCR 091. 粉刷房子 2. 题目描述&#xff1a; 假如有一排房子&#xff0c;共 n 个&#xff0c;每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种&#xff0c;你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然&#xff0c;因为…

Ubuntu20上离线安装samba

如果联网&#xff0c;一条 sudo apt-get install samba就可能解决问题&#xff0c;但是没有网&#xff0c;那么只能一个一个的解决问题&#xff1a; 我以为装了samba-common就可以了&#xff0c;发现smbd.serverice not found,于是开始了漫长的下载依赖包&#xff0c;安装&…

Linux中Team链路聚合配置

目录 一、Team介绍 二、网卡的bonding和Teaming技术 三、Teaming常用工作模式 四、实验环境 五、添加物理网卡 1、给虚拟机新增四张物理网卡 2、查看网卡信息 六、Team链路聚合配置 1、创建team0的网络接口 2、为team0设置静态IP,掩码位&#xff0c;网关&#xff0c;dns…

【Django-01】 视图函数和视图类

视图函数 作用详解视图函数的特点视图类实际开发怎么用一个无意义的demo 作用 用于返回给前端数据详解 def list(request):"""1.普通的视图函数 request是HttpRequest 函数2.且必须用request.GET|request.POST 指定方法是什么方法3.返回值不能用 rest_framewor…

25 - 单例模式:如何创建单一对象优化系统性能?

从这一讲开始&#xff0c;我们将一起探讨设计模式的性能调优。在《Design Patterns: Elements of Reusable Object-Oriented Software》一书中&#xff0c;有 23 种设计模式的描述&#xff0c;其中&#xff0c;单例设计模式是最常用的设计模式之一。无论是在开源框架&#xff0…

Java并发编程第12讲——cancelAcquire()流程详解及acquire方法总结

上篇文章介绍了AQS的设计思想以及独占式获取和释放同步状态的源码分析&#xff0c;但是还不够&#xff0c;一是感觉有点零零散散&#xff0c;二是里面还有很多细节没介绍到——比如cancelAcquire()方法&#xff08;重点&#xff09;&#xff0c;迫于篇幅原因&#xff0c;今天就…

Spring Cloud实战 |分布式系统的流量控制、熔断降级组件Sentinel如何使用

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

数据的4个等级

除了可以将数据分为定量和定性的&#xff0c;数据还可以分为以下4个等级&#xff0c;每个等级都有不同的控制和数学操作等级&#xff1b; 定类等级&#xff08;nominal level&#xff09; 定序等级&#xff08;ordinal level&#xff09; 定距等级&#xff08;interval level&a…

【CVPR 2023】解读VideoFusion:基于噪声共享机制的视频生成

Diffusion Models视频生成-博客汇总 前言:达摩院开源的VideoFusion是为数不多同时开源模型和推理代码的视频生成工作,通过设计噪声分解机制有效提高视频的时空连贯性,在一些关键指标上远超GAN-based方法和2022年谷歌的VDM。更重要的是,Diffusers库以此为基础,写了关键的两…

同时创建多个websoket(初始化多个连接、断开的重连、每个连接定时发消息、每个连接存储接收的数据(vuex或者pinia))

可复制现成代码直接使用&#xff01;&#xff01; 1.下边的例子演示了创建10个WebSocket 实例&#xff0c;当其中某一个连接失败时&#xff0c;会自动进行重连 <template><div></div> </template><script setup> import { ref, reactive, onMo…

ssh和scp的基本使用

ssh和scp的基本使用 1&#xff0c;ssh 本地连接远程服务器 ssh userhostname第一次连接时输入密码会生成密钥&#xff0c;后续就可以直接连接了 ssh配置文件&#xff1a;/etc/ssh/sshd_config 2&#xff0c;scp 传输本地文件至远程服务器 命令格式 scp [参数] [原路径] […

求二叉树的最大密度(可运行)

最大密度&#xff1a;二叉树节点数值的最大值 如果没有输出结果&#xff0c;一定是建树错误&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 我设置输入的是字符型数据&#xff0c;比较的ASCII值。 输入&#xff1a;FBE###CE### 输…

基于单片机设计的气压与海拔高度检测计(采用MPL3115A2芯片实现)

一、前言 随着科技的不断发展&#xff0c;在许多领域中&#xff0c;对气压与海拔高度的测量变得越来越重要。例如&#xff0c;对于航空和航天工业、气象预报、气候研究等领域&#xff0c;都需要高精度、可靠的气压与海拔高度检测装置。针对这一需求&#xff0c;基于单片机设计…

19.删除链表的倒数第 N 个节点

​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 使用双指针找到倒数第 N1 个节点后删除链表的第 N 个节点即可。注意当 N 为链表长度时&#xff0c;倒数第 N1 …

Google Play 搜索不到应用

Google Play搜索不到已上架应用 这可能是由于多种原因造成的。首先&#xff0c;请确保你的应用在 Google Play 商店上已经成功上架&#xff0c;并且通过了审核。 如果你的应用已经上架&#xff0c;但在搜索时无法找到&#xff0c;可能有以下一些原因&#xff1a; 「1.索引延迟…

wpf devexpress实现输入验证使用验证规则

打开此项目 目标是一个registration form行为像google registration form。打开Google registration form 研究它的行为。当form是第一次显示&#xff0c;它的“Register”按钮应该启动&#xff1b;编辑器没有提示任何输入错误。输入First Name编辑器字段&#xff0c;清理输入…