当前位置: 首页 > news >正文

.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;}

相关文章:

  • asterisk dialplan(extension)学习笔记
  • 嵌入式软件基础知识——1
  • 【SpringBoot篇】阿里云OSS—存储文件的利器
  • 【Java 进阶篇】Jedis 操作 String:Redis中的基础数据类型
  • PyQt6运行QTDesigner生成的ui文件程序
  • Linux C++网络编程-王健伟
  • Qt文件读写详解
  • JMeter+Python 实现异步接口测试
  • Windows环境搭建
  • Jenkins与Docker的自动化CI/CD流水线实践
  • 硬盘上不小心删除了重要文档?试试这6个成功率高的数据恢复工具!
  • billet-doux
  • Centos 7、Debian、Ubuntu中tree指令的检查与下载
  • sql 动态语句
  • Tower for Mac:强大的Git客户端,轻松管理代码版本,提升开发效率
  • JavaScript-如何实现克隆(clone)函数
  • 【Amaple教程】5. 插件
  • Android单元测试 - 几个重要问题
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • js
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • MySQL数据库运维之数据恢复
  • react 代码优化(一) ——事件处理
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 关于List、List?、ListObject的区别
  • 简单易用的leetcode开发测试工具(npm)
  • 排序算法学习笔记
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 一天一个设计模式之JS实现——适配器模式
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 06-01 点餐小程序前台界面搭建
  • 如何用纯 CSS 创作一个货车 loader
  • ​插件化DPI在商用WIFI中的价值
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #laravel 通过手动安装依赖PHPExcel#
  • #QT(串口助手-界面)
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (LeetCode C++)盛最多水的容器
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • . NET自动找可写目录
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • @Pointcut 使用
  • @Service注解让spring找到你的Service bean
  • @WebServiceClient注解,wsdlLocation 可配置
  • @软考考生,这份软考高分攻略你须知道
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [ solr入门 ] - 利用solrJ进行检索
  • []C/C++读取串口接收到的数据程序
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [BUG] Authentication Error