今天用Dapper更新是用到了IN写法,园子里找了篇文章这样写到 传统sql in (1,2,3) 用dapper就这样写
| 
					 1 2 3  | 
						conn.Query<Users>("SELECT * FROM Users s WHERE s.id IN (@ids) ",new { ids = new int[]{1,2,3}}) conn.Query<Users>("SELECT * FROM Users s WHERE s.id IN (@ids) ",new { ids = IDs.ToArray()})  | 
					
用了之后出现, System.Data.SqlClient.SqlException:““,”附近有语法错误。” 这样的提示, 跟踪SQL语句时发现按以上方法生成的SQL语句是这样的:
| 
					 1  | 
						exec sp_executesql N'update WebSiteChanelListPage set status=0 where ID IN ((@ilist1,@ilist2))',N'@ilist1 int,@ilist2 int',@ilist1=1,@ilist2=2  | 
					
我们不难发现生成的语句中多了一层括号,于是果段修改代码:
| 
					 1 2  | 
						 string UpdateString = "update WebSiteChanelListPage set status=0 where ID IN @ilist";  connection.Execute(UpdateString,new { ilist = idlist.ToArray() });  | 
					
执行成功!问题解决! 当然也有可能是我的Dapper的版本问题,我用得是:Dapper 1.50.4.0 from:https://www.cnblogs.com/cmt/p/14580194.html?from=https%3A%2F%2Fwww.cnblogs.com%2Fxwei%2Fp%2F8794384.html&blogId=121045&postId=8794384
View Details一 概述 一般地,我们在研究一个问题时,常规的思路是为该问题建模;我们在研究相似问题时,常规思路是找出这些问题的共性和异性。基于该思路,我们如何研究WebApi参数传递问题呢? 首先,从参数本身来说,种类较为多(如int,double,float,string,array,Object等),且有些类型较为复杂(如值类型和引用类型的机制等); 其次,从基于WebApi的Http请求方法来说,种类多且不尽相同(如Get,post,Delete,put,head等),在上一篇文章 :【WebApi系列】浅谈HTTP在WebApi开发中的运用 中,我们简要描述了Http请求的20个方法; ………. 如此复杂且不尽相同,关于WebApi参数传递,我们该选择什么作为切入点来研究呢?基于我们上面提到的研究思路,我们想到了.NET Framework框架,那么,我们来看看基于.NET Framework框架的的WebApi 模板是怎样的呢? 请按图中步骤操作 我们来看看Values控制器是怎样的
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29  | 
						public class ValuesController : ApiController     {         // GET api/values         public IEnumerable<string> Get()         {             return new string[] { "value1", "value2" };         }         // GET api/values/5         public string Get(int id)         {             return "value";         }         // POST api/values         public void Post([FromBody]string value)         {         }         // PUT api/values/5         public void Put(int id, [FromBody]string value)         {         }         // DELETE api/values/5         public void Delete(int id)         {         }     }  | 
					
从Values控制器,我们不难得出如下几个结论: (1)WebApi常规方法为四个:Get,Post,Put和Delete; (2)四种方法的参数可归结为两大类:url传递(Request-url)和Body(Request-body)传递; (3)基于(2),我们将四种方法的参数传递归为两大类,而这两大类又集中在Get和Post中体现了(Put是Get和Post的组合,Delete与Get类似); 其实,分析到现在,我们很容易找得到了研究WebApi参数传递的切入点?研究Get和Post方法参数传递即可。是的,没错,我们本篇文章就是基于Get和Post方法的参数传递,前者对应Request-url,后者对应Reqeust-Body。 二 Get 1 基础数据类型 1.1 方法只含一个形参(参数传得进去) ajax
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						$(document).ready(function () {    $("#FindProdcutDetail").click(function () {        $.ajax({                type: "Get",                //url: "/api/Default/GetProductDetails?ProductCode=JX80869"                url: "/api/Default/GetProductDetails",                data: { "ProductCode":"JX80869"}             })         })               })  | 
					
Result 总结 (1)当Get方法形参为一个且为基本数据类型时,Get方法能接受外部传递的值 (2)Get传值的本质是通过url字符串拼接,如上两两种url形式的传递的结果都是一样 url形式1
| 
					 1  | 
						url: "/api/Default/GetProductDetails?ProductCode=JX80869"  | 
					
url形式2
| 
					 1 2  | 
						url: "/api/Default/GetProductDetails", data: { "ProductCode":"JX80869"}  | 
					
我们用Goole Chrome来看看结果,发现url形式1和url形式2均一致 (3)Get传递参数本质是url字符串拼接,Request-Head头部传递,Request-Body中不能传递(这是与Post方法的本质区别),我们举两个例子 例子1:我们将形参添加[FromBody]属性后,值传递不进去 例子2:我们用PostMan来测试,发现PostMan中,Get方法参数Body为灰色,是不能选中的 1.2 方法含有多个形参(参数传得进去)
| 
					 1 2 3 4 5 6 7 8 9  | 
						$(document).ready(function () {    $("#FindProdcutDetail").click(function () {       $.ajax({                type: "Get",                url: "/api/Default/GetProductDetails",                data: { "ProductCode": "JX80869","ProductName":"YaGao"}             })         })   })  | 
					
result 2 实体对象类型(参数传不进去) model
| 
					 1 2 3 4 5 6 7 8 9 10 11 12  | 
						 1  public class ProductDetail  2     {  3         //产品编码  4         [Required]  5         public string ProductCode { get; set; }  6         //产品名称  7         [Required]  8         public string ProductName { get; set; }  9         //产品价格 10         [Required] 11         public double  ProductPrice{ get; set; } 12     }  | 
					
ajax
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						$(document).ready(function () {     var productDetail = { "ProductName": "YaGao", "ProductCode": "JX80869", "ProductPrice": 40.5};         $("#FindProdcutDetail").click(function () {             $.ajax({                     type: "Get",                     url: "/api/Default/ProductDetails",                     data: productDetail                 })             })         })  | 
					
result: 分析 3 实体对象和基础数据类型混合(实体传不进去,基础数据能传递进去) ajax
| 
					 1 2 3 4 5 6 7 8 9  | 
						1 $(document).ready(function () { 2    $("#FindProdcutDetail").click(function () { 3        $.ajax({ 4                 type: "Get", 5                 url: "/api/Default/GetProductDetails", 6                 data: { "_productDetail": "ObjectEntity","ProductName":"YaGao"} 7              }) 8         }) 9     })  | 
					
result 4 最小满足原则(参数传得进去) 所谓“最小满足原则”,指外部参数必须至少满足被调用方法的形参(形参个数,形参类型和形参名字),换句话说,被调用方法具有的形参,外部参数必须传递进来,被调用方法没有 的形参,外部参数传递与否都可以,否则将会产生状态码404错误,用数学集合的思路来理解的话,被调用方法的形参相当于外部参数的子集。如下例子,我们举一个真子集的例子, 即外部传递参数的个数大于被调方法的的形参个数。 Ajax
| 
					 1 2 3 4 5 6 7 8 9  | 
						 $(document).ready(function () {     $("#FindProdcutDetail").click(function () {        $.ajax({                 type: "Get",                 url: "/api/Default/GetProductDetails",                 data: {"ProductCode": "JX00034", "ProductName": "YaGao", "ProductPrice": 20.5, "PrudcutType": "Daily Necessities"}                 })             })         })  | 
					
result 分析:主要原因是路由规则,路由从url里面取参数与aciton参数匹配,直到匹配满足为止,具体详细深入内容,在【WebApi系列】路由章节分析。 5 url长度限制 url参数长度是有一定限制的,当超过一定长度,会报404错误 ajax
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37  | 
						 $(document).ready(function () {             $("#FindProdcutDetail").click(function () {                 $.ajax({                     type: "Get",                     url: "/api/Default/GetProductDetails",                     data: {                         "ProductCode":                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +                         "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"                      }                 })             })         })  | 
					
result 6 Get规范化 关于Get类型规范化,应注意两点,避免不必要的错误或异常:(1)方法的命名尽量采用:“Get+方法名”的形式 (2)在每个方法上加上特性[HttpGet]。 […]
View Details网上看到很多关于这这个问题的解决方案,但是都不正确,我也恰巧遇到这个问题,所有把正确的解决方案写出来,希望给后来人参考,如有不同意见欢迎指正
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35  | 
						namespace WebApi.Controllers {     [Route("api/[controller]")]     [ApiController]     public class ValuesController : ControllerBase     {         // GET api/values         [HttpGet]         public ActionResult<IEnumerable<string>> Get()         {             return new string[] { "value1", "value2" };         }         // GET api/values/5         [HttpGet("{id}")]         public ActionResult<string> Get(int id)         {             return "value";         }         // POST api/values         [HttpPost]         public IActionResult Post([FromBody] string value)         {             return Ok(value);         }         // PUT api/values/5         [HttpPut("{id}")]         public void Put(int id, [FromBody] string value)         {         }     } }  | 
					
| 
					 1 2 3 4 5 6  | 
						### POST http://localhost:49518/api/values HTTP/1.1 Content-Type: application/json "ddddff"  | 
					
| 
					 1 2 3 4 5 6 7  | 
						var value = '1111';$.ajax({  type: 'POST', contentType: "application/json",  url: url,  data: value, //如果是 string,int 直接传值 ,如果是模型 就要传对象{} .......省略 });  | 
					
也就是data 不要传{} 对象,直接传字符串或者int from:https://www.cnblogs.com/microestc/p/11003233.html
View Details先问个问题:为什么要使用加密算法? 因为数据在网络中传输时面临4个问题: 窃听 假冒 篡改 事后否认 加密技术就是用来解决“窃听”这个问题的。通常分为两大类:对称加密和非对称加密。 对称加密 概念:对称加密就是加密和解密使用同一个密钥,通常称之为“Session Key ”,这种加密技术在当今被广泛采用,如美国政府所采用的DES加密标准就是一种典型的对称加密算法,它的Session Key长度为56bits。 优点:算法公开、计算量小、加密速度快、加密效率高。适用于需要加密大量数据的场景。 缺点:由于加解密使用同一个密钥,密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦。例如:不适用于浏览器到服务器的通信,因为密钥一旦发送到浏览器端就很容易暴露。 常见算法:AES,DES,3DES,TDEA,Blowfish,RC5,IDEA 非对称加密 概念:非对称加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用。“公钥”是指可以对外公布的,“私钥”则不能,只能由持有人一个人知道。 优点:由于加解密是用不同的密钥,私钥并不公开,这样就保证了信息在网络传输中的安全性:即使被拦截也无法解密。非常适用于客户端到服务端的数据传输。例如:支付宝的支付请求,数字签名等。 缺点:加密速度慢,比较耗资源。只适用于少量敏感信息的加密。如果加密大量消息则效率会变得低下。另外,如果动态生成公钥和私钥也比较耗资源。 常见算法:RSA,Elgamal,背包算法,Rabin,D-H,ECC 有人可能会问,上面两类加密方式怎么没有MD5?MD5……严格意义上说不是一种加密算法,因为它不能解密。它只是一种密码散列算法,只是为了校验信息用的:保证信息没有篡改。如:你下载软件或游戏时,在下载页面官方都会提供一个“MD5字符串”,你下载完成后可以用md5工具对下载到的软件md5校验,如果得到的md5串和下载页面的一致,就说明软件或游戏没有被篡改过,可放心使用。 下面我们就一块来实战几种常见的加密方式和散列算法: DES 分类:对称加密 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99  | 
						using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace EncryptionPractice.Utils {     public class DESUtils     {         /// <summary>          /// 加密数据          /// </summary>          /// <param name="text"></param>          /// <param name="sessionKey"></param>          /// <returns></returns>          public static string Encrypt(string text, string sessionKey)         {             try             {                 var des = GetDESProvider(sessionKey);                 var bytes = Encoding.Default.GetBytes(text);                 using var memoryStream = GetMemoryStream(des.CreateEncryptor(), bytes);                 var result = new StringBuilder();                 foreach (var byteItem in memoryStream.ToArray())                 {                     result.AppendFormat("{0:X2}", byteItem);                 }                 return result.ToString();             } catch {                  return string.Empty;              }         }         /// <summary>          /// 解密数据          /// </summary>          /// <param name="ciphertext"></param>          /// <param name="sessionKey"></param>          /// <returns></returns>          public static string Decrypt(string ciphertext, string sessionKey)         {             try             {                 var length = ciphertext.Length / 2;                 var bytes = new byte[length];                 for (var i=0; i<length; i++)                 {                     var j = Convert.ToInt32(ciphertext.Substring(i * 2, 2), 16);                     bytes[i] = (byte) j;                 }                 var des = GetDESProvider(sessionKey);                 using var memoryStream = GetMemoryStream(des.CreateDecryptor(), bytes);                 return Encoding.Default.GetString(memoryStream.ToArray());             }             catch             {                 return string.Empty;             }         }         /// <summary>         /// 获取DES引擎         /// </summary>         /// <param name="sessionKey"></param>         /// <returns></returns>         private static DESCryptoServiceProvider GetDESProvider(string sessionKey)         {             var md5Key = MD5Utils.Get32(sessionKey).Substring(8, 8);             var des = new DESCryptoServiceProvider             {                 Key = Encoding.ASCII.GetBytes(md5Key),                 IV = Encoding.ASCII.GetBytes(md5Key)             };             return des;         }         /// <summary>         /// 获取内存流         /// </summary>         /// <param name="cryptoTransform"></param>         /// <param name="bytes"></param>         /// <returns></returns>         private static MemoryStream GetMemoryStream(ICryptoTransform cryptoTransform, byte[] bytes)         {             var memoryStream = new MemoryStream();             using var cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write);             cryptoStream.Write(bytes, 0, bytes.Length);             cryptoStream.FlushFinalBlock();             return memoryStream;         }     } }  | 
					
AES 分类:对称加密 高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90  | 
						using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace EncryptionPractice.Utils {     public class AESUtils     {         /// <summary>         /// 默认Key         /// </summary>         const string KEY = "E10ADC3949BA59AB";         /// <summary>         /// 默认偏移量         /// </summary>         const string IV = "BE56E057F20F883E";         /// <summary>         /// 加密         /// </summary>         /// <param name="text"></param>         /// <param name="key"></param>         /// <param name="iv"></param>         /// <returns></returns>         public static string Encrypt(string text, string key = KEY, string iv = IV)         {             var bytes = Encoding.UTF8.GetBytes(text);             var result = Origin(bytes, false, key, iv);             return Convert.ToBase64String(result, 0, result.Length);         }         /// <summary>         /// 解密         /// </summary>         /// <param name="ciphertext"></param>         /// <param name="key"></param>         /// <param name="iv"></param>         /// <returns></returns>         public static string Decrypt(string ciphertext, string key = KEY, string iv = IV)         {             var bytes = Convert.FromBase64String(ciphertext);             var result = Origin(bytes, true, key, iv);             if (result.Length < 1)                  return string.Empty;             return Encoding.UTF8.GetString(result);         }         /// <summary>         /// 底层方法         /// </summary>         /// <param name="bytes"></param>         /// <param name="isDecrypt"></param>         /// <param name="key"></param>         /// <param name="iv"></param>         /// <returns></returns>         private static byte[] Origin(byte[] bytes, bool isDecrypt, string key = KEY, string iv = IV)         {             try             {                 var keyBytes = Encoding.UTF8.GetBytes(key);                 var ivBytes = Encoding.UTF8.GetBytes(iv);                 var rijndaelManaged = new RijndaelManaged                 {                     BlockSize = 128,                     KeySize = 256,                     FeedbackSize = 128,                     Padding = PaddingMode.PKCS7,                     Key = keyBytes,                     IV = ivBytes,                     Mode = CipherMode.CBC                 };                 var cryptoTransform = isDecrypt ? rijndaelManaged.CreateDecryptor() : rijndaelManaged.CreateEncryptor();                 var result = cryptoTransform.TransformFinalBlock(bytes, 0, bytes.Length);                 return result;             }             catch             {                 return new byte[] { };             }         }     } }  | 
					
RSA 分类:非对称加密 RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。RSA就是他们三人姓氏开头字母拼在一起组成的。RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82  | 
						using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace EncryptionPractice.Utils {     public class RSAUtils     {         /// <summary>         /// 加密         /// </summary>         /// <param name="text">明文</param>         /// <param name="publicKey">公钥</param>         /// <returns>密文</returns>         public static string Encrypt(string text, string publicKey)         {             var blockSize = 256; // 加密块大小,越大越慢             var bytes = Encoding.UTF8.GetBytes(text);             var length = bytes.Length;             // rsa实例             var rsa = new RSACryptoServiceProvider();             rsa.FromXmlString(publicKey);             var offSet = 0; // 游标             var i = 0;             byte[] cache;             var ms = new MemoryStream();             while (length - offSet > 0)             {                 var len = length - offSet > blockSize ? blockSize : length - offSet;                 var temp = new byte[len];                 Array.Copy(bytes, offSet, temp, 0, len);                 cache = rsa.Encrypt(bytes, false);                 ms.Write(cache, 0, cache.Length);                 i++;                 offSet = i * blockSize;             }             var cipherBytes = ms.ToArray();             return Convert.ToBase64String(cipherBytes);         }         /// <summary>         /// RSA解密         /// </summary>         /// <param name="ciphertext">密文</param>         /// <param name="privateKey">私钥</param>         /// <returns>明文</returns>         public static string Decrypt(string ciphertext, string privateKey)         {             var blockSize = 256;             var bytes = Convert.FromBase64String(ciphertext);             var length = bytes.Length;             // rsa实例             var rsa = new RSACryptoServiceProvider();             rsa.FromXmlString(privateKey);             var offSet = 0; // 游标             var i = 0;             byte[] cache;             var ms = new MemoryStream();             while (length - offSet > 0)             {                 var len = length - offSet > blockSize ? blockSize : length - offSet;                 var temp = new byte[len];                 Array.Copy(bytes, offSet, temp, 0, len);                 cache = rsa.Decrypt(temp, false);                 ms.Write(cache, 0, cache.Length);                 i++;                 offSet = i * blockSize;             }             var cipherBytes = ms.ToArray();             return Encoding.UTF8.GetString(cipherBytes);         }     } }  | 
					
生成公钥/密钥的方法(只适用于C#,其他编程语言使用需要转换)
| 
					 1 2 3  | 
						var rsa = new RSACryptoServiceProvider(); var publicKey = rsa.ToXmlString(false); var privateKey = rsa.ToXmlString(true);  | 
					
MD5 分类:散列算法 MD5信息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63  | 
						using System; using System.Security.Cryptography; using System.Text; namespace EncryptionPractice.Utils {     public class MD5Utils     {         /// <summary>         /// 获取16位散列值         /// </summary>         /// <param name="text"></param>         /// <returns></returns>         public static string Get16(string text)         {             return Get32(text).Substring(7, 16);         }         /// <summary>         /// 获取32位散列值         /// </summary>         /// <param name="text"></param>         /// <returns></returns>         public static string Get32(string text)         {             using var md5 = MD5.Create();             var hash = md5.ComputeHash(Encoding.UTF8.GetBytes(text));             var result = BitConverter.ToString(hash);             return result.Replace("-", "").ToUpper();         }         /// <summary>         /// 获取16位散列值 v2         /// </summary>         /// <param name="text"></param>         /// <returns></returns>         public static string Get16v2(string text)         {             return Get32v2(text).Substring(7, 16);         }         /// <summary>         /// 获取32位散列值         /// </summary>         /// <param name="text">字符串</param>         /// <returns></returns>         public static string Get32v2(string text)         {             var md5 = new MD5CryptoServiceProvider();             var hash = md5.ComputeHash(Encoding.Default.GetBytes(text));             var resutl = new StringBuilder();             for (int i = 0; i < hash.Length; i++)             {                 resutl.Append(hash[i].ToString("x2"));             }             return resutl.ToString().ToUpper();         }     } }  | 
					
SHA-2 分类:散列算法 SHA-2,名称来自于安全散列算法2(英语:Secure Hash Algorithm 2)的缩写,一种密码散列函数算法标准,由美国国家安全局研发,由美国国家标准与技术研究院(NIST)在2001年发布。属于SHA算法之一,是SHA-1的后继者。其下又可再分为六个不同的算法标准,包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28  | 
						using System.Security.Cryptography; using System.Text; namespace EncryptionPractice.Utils {     public class SHAUtils     {         /// <summary>         /// SHA256加密         /// </summary>         /// <param name="data"></param>         /// <returns></returns>         public static string Encrypt(string data)         {             var bytes = Encoding.UTF8.GetBytes(data);             var hash = SHA256.Create().ComputeHash(bytes);             var result = new StringBuilder();             for (int i = 0; i < hash.Length; i++)             {                 result.Append(hash[i].ToString("x2"));             }             return result.ToString();         }     } }  | 
					
欢迎转载,请注明出处:龙生时代
View Details问题: 之前在VS2012、VS2015中,可直接在应用程序中Console.WriteLine输出信息来调试bug。最近换到VS2017后,却发现怎么也无法输出 解决: 这个问题的原因是VS2017开始已经不再使用Hosting Process模式,在Hosting Process时可以将信息输出至 Output窗口。 在VS2017及以后的版本可以使用Trace.WriteLine来将调试信息输出至Output窗口。 另外VS2017对CPU的要求也高了,我的老机器一打开没多久就出现很多ServiceHub.Host.CLR.x86.exe的进程,导致写代码卡顿,不得已换了新机器,升级到i5后没再出现卡顿现象了。一起典型的软件倒逼硬件更新的例子,诸君勿笑. from:https://blog.csdn.net/edcvf3/article/details/104827175
View Details//参数直接写参数名 string Sql = "select * from [table] where field like @field"; //参数值里面加上通配符,varchar类型查询也不加单引号 var Param = new {field = "%{ParamValue}%"}; //执行查询 Dapper.Query<T>(Sql,Param); from:https://www.cnblogs.com/tian2008/p/8491633.html
View Details转成 Base64 形式的 System.String:
| 
					 1 2 3 4 5  | 
						    string a = "base64字符串与普通字符串互转";       byte[] b = System.Text.Encoding.Default.GetBytes(a);           //转成 Base64 形式的 System.String       a = Convert.ToBase64String(b);       Response.Write(a);  | 
					
转回到原来的 System.String:
| 
					 1 2 3  | 
						    byte[] c = Convert.FromBase64String(a);       a = System.Text.Encoding.Default.GetString(c);       Response.Write(a);<br>  | 
					
from:https://www.cnblogs.com/daimaxuejia/p/12893207.html
View Details| 
					 1 2 3 4 5 6  | 
						public static bool IsPropertyExist(dynamic data, string propertyname) {     if (data is ExpandoObject) 	return ((IDictionary<string, object>)data).ContainsKey(propertyname);     return data.GetType().GetProperty(propertyname) != null; }  | 
					
https://www.cnblogs.com/94cool/p/8135579.html
View Details前置条件 官网下载页面:https://dotnet.microsoft.com/en-us/download/dotnet/3.1 安装ASP.NET Core Runtime 3.1.31 安装 Hosting Bundle 3.1.31 执行以下命令 net stop was /y net start w3svc 发布应用 部署到IIS 1.应用程序池:选择无托管模式。我电脑是64位,选择“启用32位应用程序”为“false”。 2.网站设置 为你的网站创建windows用户,把网站目录设置对该用户全部权限。 IIS管理器选择你的网站:基本设置 -> 连接为 -> 特定用户。 参考资料: https://blog.csdn.net/weixin_33757609/article/details/93693395 https://blog.csdn.net/xulong5000/article/details/106072771 https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/publish-to-iis?view=aspnetcore-3.1&tabs=visual-studio
View Details服务器版本:window server 2012 R2 Standard SDK 版本: dotnet-sdk-3.1.302-win-x64.exe 部署步骤: 1. 官网下载sdk( https://download.visualstudio.microsoft.com/download/pr/56b00a71-686f-4f27-9ad1-9b30308688ed/1fa023326e475813783a240532c9f2c8/dotnet-sdk-3.1.302-win-x64.exe ) 2.安装部署: 拷贝到服务器,双击安装,安装完毕后,打开cmd名称,输入 dotnet命令查看。。。。结果如下 这是个啥??? 某度查询说是缺少补丁,需要打补丁,服务器又不能联网只能手动上网单独下载了。 其中:https://www.microsoft.com/en-us/download/details.aspx?id=42334 这里面包含KB2919355,KB2932046,KB2934018,KB2937592,KB2938439,KB2959977,chearcompressionflag.exe,可以一次下载。 但是在安装这些补丁之前需要先安装KB2999226 地址 https://www.microsoft.com/en-us/download/confirmation.aspx?id=49063 和 KB2919442,地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=42135 补丁安装顺序: KB2999226 KB2919442, clearcompressionflag.exe、 KB2919355、 KB2932046、 KB2959977、 KB2937592、 KB2938439、 KB2934018。 严格按照补丁顺序安装,否则不确保是否能安装成功。 最后在安装 Visual C++ Redistributable for Visual Studio 2015 地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=48145 安装时提示重启,可以都安装完毕后重启,也可以每次重启,我是都安装完了再重启的,也可以成功。 安装重启后,在cmd命令下输入 dotnet --version 如果出现一下内容,就说明安装成功 光子:我按以上教程实际操作时不行,要安装:https://www.microsoft.com/en-us/download/confirmation.aspx?id=42162 from:https://www.cnblogs.com/jone_sun/p/13403269.html
View Details