[关闭]
@Aiti 2019-12-06T06:07:32.000000Z 字数 9084 阅读 336

扩展随记(加密、序列化、泛型、数组去重)

未分类


IIS网站本机可以访问,局域网其他机器无法访问

在部署网站到服务器的时候,发现本地访问网站没问题,但是局域网其他机器无法访问,或者在把相应端口映射后,外网也无法访问初步解决方案——防火墙规则

1、打开【控制面板】,选择【WINDOWS 防火墙】,进入
2、在防火墙界面,选择左侧边栏的【高级设置】
3、在弹出的高级安全Windows防火墙界面中,选择左侧边栏的【入站规则】,然后在右侧边栏选择【新建规则】
4、在弹出的窗口中完成如下操作:
选择【端口】,下一步;
选择【TCP】以及【特定本地端口】,填入要开放的端口号(或开放所有端口,可以以逗号分隔多个端口),下一步;
【允许连接】,下一步;
网络类型全部勾选,下一步;
【名称】中填入自定义名称,如:IIS 【完成】。

Url 编码/解码

using system.web
编码:
HttpUtility.UrlEncode(url)
解码:
HttpUtility.UrlDecode(url)

MD5加密

MD5:
1、不可逆性。
2、任意长度的明文字符串,加密后得到的密文字符串是长度固定的。
在加密用户的密码时,考虑到密码可能一样,需要用盐值来解决这个问题,就是给每个用户生成一个随机的盐值,在作保存和校验时,需要把用户的Salt值加入到密码原文中再作MD5运算,这样就可以使得相同的密码生成不同的编码.

  1. //引用
  2. using System.Security.Cryptography;
  3. using System.Text;
  4. byte[] result = Encoding.Default.GetBytes(this.tbPass.Text.Trim()); //tbPass为输入密码的文本框
  5. MD5 md5 = new MD5CryptoServiceProvider();
  6. byte[] output = md5.ComputeHash(result);
  7. this.tbMd5pass.Text = BitConverter.ToString(output).Replace("-",""); //tbMd5pass为输出加密文本的文本框

//Bim999在这里就是固定盐值,固定盐值就不需要存入数据库

  1. this.tbMd5pass.Text = = BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(Encoding.Default.GetBytes("Bim999" + value.ToString()))).Replace("-", "");

Base64 加密/解密

Base64:
1、可逆性。
2、可以将图片等二进制文件转换为文本文件,方便使用HTTP协议等。
3、可以把非ASCII字符的数据转换成ASCII字符,避免不可见字符.

/// Base64加密,Encoding.UTF8采用utf8编码方式加密
using system.web
加密:
Base64Encode(Encoding.UTF8, str);
解密:
Base64Decode(Encoding.UTF8, str);

可以封装成一个Base64的帮助类;可以根据加密与解密的类型

  1. class Base64Helper
  2. {
  3. /// <summary>
  4. /// Base64加密,采用utf8编码方式加密
  5. /// </summary>
  6. /// <param name="source">待加密的明文</param>
  7. /// <returns>加密后的字符串</returns>
  8. public static string Base64Encode(string source)
  9. {
  10. return Base64Encode(Encoding.UTF8, source);
  11. }
  12. /// <summary>
  13. /// Base64加密
  14. /// </summary>
  15. /// <param name="encodeType">加密采用的编码方式</param>
  16. /// <param name="source">待加密的明文</param>
  17. /// <returns></returns>
  18. public static string Base64Encode(Encoding encodeType, string source)
  19. {
  20. string encode = string.Empty;
  21. byte[] bytes = encodeType.GetBytes(source);
  22. try
  23. {
  24. encode = Convert.ToBase64String(bytes);
  25. }
  26. catch
  27. {
  28. encode = source;
  29. }
  30. return encode;
  31. }
  32. /// <summary>
  33. /// Base64解密,采用utf8编码方式解密
  34. /// </summary>
  35. /// <param name="result">待解密的密文</param>
  36. /// <returns>解密后的字符串</returns>
  37. public static string Base64Decode(string result)
  38. {
  39. return Base64Decode(Encoding.UTF8, result);
  40. }
  41. /// <summary>
  42. /// Base64解密
  43. /// </summary>
  44. /// <param name="encodeType">解密采用的编码方式,注意和加密时采用的方式一致</param>
  45. /// <param name="result">待解密的密文</param>
  46. /// <returns>解密后的字符串</returns>
  47. public static string Base64Decode(Encoding encodeType, string result)
  48. {
  49. string decode = string.Empty;
  50. byte[] bytes = Convert.FromBase64String(result);
  51. try
  52. {
  53. decode = encodeType.GetString(bytes);
  54. }
  55. catch
  56. {
  57. decode = result;
  58. }
  59. return decode;
  60. }
  61. }

无法再Web服务器上启动调试,可能是远程调试监视器(MSVSMON.EXE)似乎没有在远程计算机上运行,或者防火墙原因。

首页ping一下远程地址(api.bim999.net),看看对应的IP是不是目标IP地址(192.168.1.143);
如果不是需要重新定向,修改Host的。
修改路径:C:\Windows\System32\drivers\etc
增加一条语句:
192.168.1.143 api.bim999.net

Json/String序列化和反序列化

class NameValue {
public string Name { get; set; }
public JObject Value { get; set; }
}
var processArray = JsonConvert.DeserializeObject>(ParameterValue);
var subiteArray = JsonConvert.DeserializeObject>(Parent.ParameterValue);
var addnamevalue = new List();
foreach (var item in processArray)
{
var tt = subiteArray.Where(o => o.Name == item.Name);
if (tt.Count() > 0)
tt.FirstOrDefault().Value = item.Value;
else
{
addnamevalue.Add(item);
}
}
subiteArray.AddRange(addnamevalue);
//序列化保存到Parent中去
Parent.ParameterValue = JsonConvert.SerializeObject(subiteArray);

接收到string类型变量,作为泛型的类型使用

列如:需要调用这个函数:

  1. private object ParentEquals<T>(object xpo,int Pid) where T: XPObject
  2. {
  3. if (Pid < 0)
  4. xpo = (xpo as IQueryable<IParentNested<T>>).Where(o => o.Parent==null);
  5. else
  6. xpo = (xpo as IQueryable<IParentNested<T>>).Where(o => o.Parent.Oid == Pid);
  7. return xpo;
  8. }
  9. 获取到的变量进行这样操作:
  10. public List<vDictBaseMini> SearchMini(vSearchModel sm)
  11. {
  12. var xpo = GetDict(sm.SearchOption["DictType"],out Type t);
  13. if (sm.SearchOption.Keys.Contains("Parent") && !string.IsNullOrWhiteSpace(sm.SearchOption["Parent"]))
  14. {
  15. MethodInfo mi = this.GetType().GetMethod("ParentEquals", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly).MakeGenericMethod(t);
  16. xpo = mi.Invoke(this, new object[] {xpo, Convert.ToInt32(sm.SearchOption["Parent"]) });
  17. }
  18. if (sm.SearchOption.Keys.Contains("Code") && !string.IsNullOrWhiteSpace(sm.SearchOption["Code"]))
  19. xpo = (xpo as IQueryable<DictBaseBase>).Where(o=>o.Code== sm.SearchOption["Code"]);
  20. return Mapper.Map<List<vDictBaseMini>>(xpo);
  21. }
  1. **还有一种方式:return Mapper.Map<List<vDictBase>>(GetDict(DictType, out Type t))相当于return Mapper.Map<List<vDictBaseMini>>(xpo)**
  2. public List<vDictBase> Get(string DictType)
  3. {
  4. return Mapper.Map<List<vDictBase>>(GetDict(DictType, out Type t));
  5. }
  6. private Object GetDict(string DictType,out Type XpoType)
  7. {
  8. XpoType = null;
  9. Type t = null;
  10. foreach (var assembly in new AppDomainTypeFinder().GetAssemblies())
  11. {
  12. t = assembly.GetType(DictType);
  13. if (t != null)
  14. break;
  15. }
  16. if (t != null)
  17. {
  18. Type QueryType = typeof(XPQuery<>).MakeGenericType(t);
  19. MethodInfo mi = typeof(ApiControllerBase).GetMethod("ScopeBeInclude").MakeGenericMethod(t);
  20. var list = mi.Invoke(this, new object[]{ Activator.CreateInstance(QueryType, session) });
  21. XpoType = t;
  22. return list;
  23. }
  24. return null;
  25. }
  1. 应用之后:
  2. v变量;
  3. var o = XpoHelper.ViewModelToXpo<NVRServer>(v, sessionnull);
  4. o.Save();
  5. 对于“NVRServer”类型不确认的,通过接收参数来确认的
  6. 解决:
  7. 通过Url接收参数:
  8. var DictType = RequestHelper.Get("DictType");
  9. Type t = null;
  10. foreach (var assembly in new AppDomainTypeFinder().GetAssemblies())
  11. {
  12. t = assembly.GetType(DictType);
  13. if (t != null)
  14. break;
  15. }
  16. MethodInfo mi = typeof(XpoHelper).GetMethod("ViewModelToXpo").MakeGenericMethod(t);
  17. var o = (mi.Invoke(this, new object[] { v, session,null })) as XPBaseObject;
  18. o.Save();
  1. public IHttpActionResult Delete(int id,string DictType)
  2. {
  3. Type t = null;
  4. foreach (var assembly in new AppDomainTypeFinder().GetAssemblies())
  5. {
  6. t = assembly.GetType(DictType);
  7. if (t != null)
  8. break;
  9. }
  10. MethodInfo mi = this.GetType().GetMethod("GetObject").MakeGenericMethod(t);
  11. var o = (mi.Invoke(this, new object[] {id})) as XPBaseObject;
  12. Log.Warn(new XpoLog(XpoAppender.Session) { Action = "删除", Object = o, Message = "删除成功" });
  13. o.Delete();
  14. return Ok("删除成功。");
  15. }
  16. /// <summary>
  17. ///
  18. /// </summary>
  19. /// <typeparam name="T"></typeparam>
  20. /// <param name="id"></param>
  21. /// <returns></returns>
  22. public T GetObject<T>(int id)
  23. {
  24. return session.GetObjectByKey<T>(id);
  25. }

数组去重

  1. /// <summary>
  2. /// 移除数组中重复数据
  3. /// </summary>
  4. /// <param name="array">需要除重的数组</param>
  5. /// <returns>不重复数组</returns>
  6. public static string[] DelRepeatData(string[] array)
  7. {
  8. return array.GroupBy(p => p).Select(p => p.Key).ToArray();
  9. }
  1. List<int> ages = new List<int> { 21, 46, 46, 55, 17, 21, 55, 55 };
  2. List<string> names = new List<string> { "wang", "li", "zhang", "li", "wang", "chen", "he", "wang" };
  3. IEnumerable<int> distinctAges = ages.Distinct();
  4. Console.WriteLine("Distinct ages:");
  5. foreach (int age in distinctAges)
  6. {
  7. Console.WriteLine(age);
  8. }
  9. var distinctNames = names.Distinct();
  10. Console.WriteLine("\nDistinct names:");
  11. foreach (string name in distinctNames)
  12. {
  13. Console.WriteLine(name);
  14. }

在这段代码中,是最简单的Distinct()方法的使用。使用了集合接口IEnumerable,以及隐式类型var,至于这两种用法有什么区别,没有研究出来。

但是如果象下面这样的代码,是错误的!

  1. [csharp] view plain copy
  2. List<int> disAge = ages.Distinct();

正确的方法应该是:

  1. [csharp] view plain copy
  2. List<int> ages = new List<int> { 21, 46, 46, 55, 17, 21, 55, 55 };
  3. List<int> disAge = ages.Distinct().ToList();
  4. foreach (int a in disAge)
  5. Console.WriteLine(a);

也就是说Distinct()方法的返回集合类型是一个接口,不是具体的集合,所以需要用一个ToList()。

设置对个Button按钮的样式和值;将多个按钮变成单选框

  1. jQuery(function ($) {
  2. $(function () {
  3. $(".btn-group").each(function () {
  4. if (HF.Get($(this).data("group"))) {
  5. $(this).find(".btn[data-criteria='" + HF.Get($(this).data("group")) + "']").addClass("focus");
  6. } else {
  7. $(this).find(".btn:first").addClass("focus");
  8. $(this).find(".btn:first").addClass("BusinessBlue");
  9. }
  10. });
  11. });
  12. $(".btn-group .btn").click(function () {
  13. //alert($(this).data("criteria"));
  14. $(this).parent().find(".btn").removeClass("focus");
  15. $(this).parent().find(".btn").removeClass("BusinessBlue");
  16. $(this).parent().find(".btn").removeClass("ElegantBlack");
  17. $(this).parent().find(".btn").removeClass("FreshBlue");
  18. $(this).addClass("focus");
  19. $(this).addClass($(this).data("criteria"));
  20. HF.Set($(this).parent().data("group"), $(this).data("criteria"));
  21. });
  22. });
  1. <dx:ASPxHiddenField ID="HF" runat="server" ClientIDMode="Static" ></dx:ASPxHiddenField>
  2. <div class="divstyle">
  3. <span class="ml20">界面风格</span>
  4. <div class="btn-group" data-group="status">
  5. <button type="button" class="btn btn-default" data-criteria="BusinessBlue">商务蓝</button>
  6. <button type="button" class="btn btn-default" data-criteria="ElegantBlack">优雅黑</button>
  7. <button type="button" class="btn btn-default" data-criteria="FreshBlue"">清新蓝</button>
  8. </div>
  9. </div>
  1. if (!HF.Contains("status"))
  2. {
  3. HF.Set("status", "BusinessBlue");
  4. }
  5. if (HF.Get("status").ToString() == "ElegantBlack")
  6. {
  7. }
  8. else if(HF.Get("status").ToString() == "FreshBlue")
  9. {
  10. }

导入文件时,服务器需安装注册Microsoft.ACE.OLEDB.12.0提供程序

问题:未在本地计算机上注册Microsoft.ACE.OLEDB.12.0提供程序
// 解决访问Excel数据源时出现 未在本地计算机上注册Microsoft.ACE.OLEDB.12.0提供程序
// 1、确保安装了Microsoft.ACE.OLEDB.12.0驱动
// http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe
// 2、在vs中右击项目--》属性--》生成 下的 目标平台 改为x86
// 如果以上两个方法还是不行的话,用第三个方法
// 3、在对应的 IIS 应用程序池中,“设置应用程序池默认属性”右击/“高级设置”/"启用32位应用程序",设置为 true。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注