Masuit-Tools,一個免費的輪子

開源地址:

https://gitee.com/masuit/Masuit.Tools

包含一些常用的操作類,大都是靜態類,加密解密,反射操作,動態編譯,權重隨機篩選算法,簡繁轉換,分佈式短 id,表達式樹,linq 擴展,文件壓縮,多線程下載和 FTP 客戶端,硬件信息,字符串擴展方法,日期時間擴展操作,中國農曆,大文件拷貝,圖像裁剪,驗證碼,斷點續傳,實體映射、集合擴展等常用封裝。

建議開發環境

操作系統:Windows 10 1903 及以上版本
開發工具:VisualStudio2019 v16.5 及以上版本
SDK:.Net Core 3.1.0 及以上版本

安裝程序包

.NET Framework ≥4.6.1

PM> Install-Package Masuit.Tools.Net

.NET Core 2.x/3.x

PM> Install-Package Masuit.Tools.Core

爲工具庫註冊配置

工具庫需要用到外部配置節:

  1. EmailDomainWhiteList,郵箱校驗需要用到的白名單域名,英文逗號分隔,每個元素支持正則表達式,若未配置,則不啓用郵箱校驗白名單

  2. EmailDomainBlockList,郵箱校驗需要用到的黑名單域名,英文逗號分隔,每個元素支持正則表達式,且黑名單優先級高於白名單,若未配置,則不啓用郵箱校驗黑白名單

  3. BaiduAK,獲取 IP / 地理位置相關百度雲 APIKey,若未配置,則無法調用 GetIPLocation 以及 GetPhysicalAddress 相關方法

public Startup(IConfiguration configuration)
{
    configuration.AddToMasuitTools(); // 若未調用,則默認自動嘗試加載appsettings.json
}

特色功能示例代碼

1. 檢驗字符串是否是 Email、手機號、URL、IP 地址、身份證號

bool isEmail="3444764617@qq.com".MatchEmail(); // 可在appsetting.json中添加EmailDomainWhiteList和EmailDomainBlockList配置郵箱域名黑白名單,逗號分隔,如"EmailDomainBlockList": "^\\w{1,5}@qq.com,^\\w{1,5}@163.com,^\\w{1,5}@gmail.com,^\\w{1,5}@outlook.com",
bool isInetAddress = "114.114.114.114".MatchInetAddress();
bool isUrl = "http://masuit.com".MatchUrl();
bool isPhoneNumber = "15205201520".MatchPhoneNumber();
bool isIdentifyCard = "312000199502230660".MatchIdentifyCard();// 校驗中國大陸身份證號
bool isCNPatentNumber = "200410018477.9".MatchCNPatentNumber(); // 校驗中國專利申請號或專利號,是否帶校驗位,校驗位前是否帶“.”,都可以校驗,待校驗的號碼前不要帶CN、ZL字樣的前綴

2. 硬件監測 (僅支持 Windows)

float load = SystemInfo.CpuLoad;// 獲取CPU佔用率
long physicalMemory = SystemInfo.PhysicalMemory;// 獲取物理內存總數
long memoryAvailable = SystemInfo.MemoryAvailable;// 獲取物理內存可用率
double freePhysicalMemory = SystemInfo.GetFreePhysicalMemory();// 獲取可用物理內存
Dictionary<string, string> diskFree = SystemInfo.DiskFree();// 獲取磁盤每個分區可用空間
Dictionary<string, string> diskTotalSpace = SystemInfo.DiskTotalSpace();// 獲取磁盤每個分區總大小
Dictionary<string, double> diskUsage = SystemInfo.DiskUsage();// 獲取磁盤每個分區使用率
double temperature = SystemInfo.GetCPUTemperature();// 獲取CPU溫度
int cpuCount = SystemInfo.GetCpuCount();// 獲取CPU核心數
IList<string> ipAddress = SystemInfo.GetIPAddress();// 獲取本機所有IP地址
string localUsedIp = SystemInfo.GetLocalUsedIP();// 獲取本機當前正在使用的IP地址
IList<string> macAddress = SystemInfo.GetMacAddress();// 獲取本機所有網卡mac地址
string osVersion = SystemInfo.GetOsVersion();// 獲取操作系統版本
RamInfo ramInfo = SystemInfo.GetRamInfo();// 獲取內存信息

3. 大文件操作

FileStream fs = new FileStream(@"D:\boot.vmdk", FileMode.OpenOrCreate, FileAccess.ReadWrite);
{
        //fs.CopyToFile(@"D:\1.bak");//同步複製大文件
        fs.CopyToFileAsync(@"D:\1.bak");//異步複製大文件
        string md5 = fs.GetFileMD5Async().Result;//異步獲取文件的MD5
}

4.html 的防 XSS 處理:

string html = @"<link href='/Content/font-awesome/css' rel='stylesheet'/>
        <!--[if IE 7]>
        <link href='/Content/font-awesome-ie7.min.css' rel='stylesheet'/>
        <![endif]-->
        <script src='/Scripts/modernizr'></script>
        <div id='searchBox' role='search'>
        <form action='/packages' method='get'>
        <span class='user-actions'><a href='/users/account/LogOff'>退出</a></span>
        <input name='q' id='searchBoxInput'/>
        <input id='searchBoxSubmit' type='submit' value='Submit' />
        </form>
        </div>";
string s = html.HtmlSantinizerStandard();//清理後:<div><span><a href="/users/account/LogOff">退出</a></span></div>

5. 整理操作系統的內存:

Windows.ClearMemorySilent();

6. 任意進制轉換

可用於生成短 id,短 hash 等操作,純數學運算。

NumberFormater nf = new NumberFormater(36);//內置2-62進制的轉換
//NumberFormater nf = new NumberFormater("0123456789abcdefghijklmnopqrstuvwxyz");// 自定義進制字符,可用於生成驗證碼
string s36 = nf.ToString(12345678);
long num = nf.FromString("7clzi");
Console.WriteLine("12345678的36進制是:" + s36); // 7clzi
Console.WriteLine("36進制的7clzi是:" + num); // 12345678
//擴展方法形式調用
var bin=12345678.ToBinary(36);//7clzi
var num="7clzi".FromBinary(36);//12345678
//超大數字的進制轉換
var num = "E6186159D38CD50E0463A55E596336BD".FromBinaryBig(16);
Console.WriteLine(num); // 十進制:305849028665645097422198928560410015421
Console.WriteLine(num.ToBinary(64)); // 64進制:3C665pQUPl3whzFlVpoPqZ,22位長度
Console.WriteLine(num.ToBinary(36)); // 36進制:dmed4dkd5bhcg4qdktklun0zh,25位長度

7. 納秒級性能計時器

HiPerfTimer timer = HiPerfTimer.StartNew();
for (int i = 0; i < 100000; i++)
{
    //todo
}
timer.Stop();
Console.WriteLine("執行for循環100000次耗時"+timer.Duration+"s");
double time = HiPerfTimer.Execute(() =>
{
    for (int i = 0; i < 100000; i++)
    {
        //todo
    }
});
Console.WriteLine("執行for循環100000次耗時"+time+"s");

8. 單機產生唯一有序的短 id

var token=Stopwatch.GetTimestamp().ToBinary(36);
var set = new HashSet<string>();
double time = HiPerfTimer.Execute(() =>
{
    for (int i = 0; i < 1000000; i++)
    {
        set.Add(Stopwatch.GetTimestamp().ToBinary(36));
    }
});
Console.WriteLine(set.Count==1000000);//True
Console.WriteLine("產生100w個id耗時"+time+"s");//1.6639039s

9. 產生分佈式唯一有序短 id

var sf = SnowFlake.GetInstance();
string token = sf.GetUniqueId();// rcofqodori0w
string shortId = sf.GetUniqueShortId(8);// qodw9728
var set = new HashSet<string>();
double time = HiPerfTimer.Execute(() =>
{
    for (int i = 0; i < 1000000; i++)
    {
        set.Add(SnowFlake.GetInstance().GetUniqueId());
    }
});
Console.WriteLine(set.Count == 1000000); //True
Console.WriteLine("產生100w個id耗時" + time + "s"); //2.6891495s

10. 農曆轉換

ChineseCalendar.CustomHolidays.Add(DateTime.Parse("2018-12-31"),"元旦節");//自定義節假日
ChineseCalendar today = new ChineseCalendar(DateTime.Parse("2018-12-31"));
Console.WriteLine(today.ChineseDateString);// 二零一八年十一月廿五
Console.WriteLine(today.AnimalString);// 生肖:狗
Console.WriteLine(today.GanZhiDateString);// 干支:戊戌年甲子月丁酉日
Console.WriteLine(today.DateHoliday);// 獲取按公曆計算的節假日
...

11.Linq 表達式樹擴展

Expression<Func<string, bool>> where1 = s => s.StartsWith("a");
Expression<Func<string, bool>> where2 = s => s.Length > 10;
Func<string, bool> func = where1.And(where2).Compile();
bool b=func("abcd12345678");//true
Expression<Func<string, bool>> where1 = s => s.StartsWith("a");
Expression<Func<string, bool>> where2 = s => s.Length > 10;
Func<string, bool> func = where1.Or(where2).Compile();
bool b=func("abc");// true

12. 模版引擎

var tmp = new Template("{{name}},你好!");
tmp.Set("name", "萬金油");
string s = tmp.Render();//萬金油,你好!
var tmp = new Template("{{one}},{{two}},{{three}}");
string s = tmp.Set("one", "1").Set("two", "2").Set("three", "3").Render();// 1,2,3
var tmp = new Template("{{name}},{{greet}}!");
tmp.Set("name", "萬金油");
string s = tmp.Render();// throw 模版變量{{greet}}未被使用

13.List 轉 Datatable

var list = new List<MyClass>()
{
    new MyClass()
    {
        Name = "張三",
        Age = 22
    },
    new MyClass()
    {
        Name = "李四",
        Age = 21
    },
    new MyClass()
    {
        Name = "王五",
        Age = 28
    }
};
var table = list.Select(c => new{姓名=c.Name,年齡=c.Age}).ToList().ToDataTable();// 將自動填充列姓名和年齡

14. 文件壓縮解壓

.NET Framework

MemoryStream ms = SevenZipCompressor.ZipStream(new List<string>()
{
    @"D:\1.txt",
    "http://ww3.sinaimg.cn/large/87c01ec7gy1fsq6rywto2j20je0d3td0.jpg",
});//壓縮成內存流
SevenZipCompressor.Zip(new List<string>()
{
    @"D:\1.txt",
    "http://ww3.sinaimg.cn/large/87c01ec7gy1fsq6rywto2j20je0d3td0.jpg",
}, zip);//壓縮成zip
SevenZipCompressor.UnRar(@"D:\Download\test.rar", @"D:\Download\");//解壓rar
SevenZipCompressor.Decompress(@"D:\Download\test.tar", @"D:\Download\");//自動識別解壓壓縮包
SevenZipCompressor.Decompress(@"D:\Download\test.7z", @"D:\Download\");

ASP.NET Core

Startup.cs

services.AddSevenZipCompressor();

構造函數注入 ISevenZipCompressor

private readonly ISevenZipCompressor _sevenZipCompressor;
public Test(ISevenZipCompressor sevenZipCompressor)
{
    _sevenZipCompressor = sevenZipCompressor;
}

使用方式同. NET Framework 版本

15. 日誌組件

LogManager.LogDirectory=AppDomain.CurrentDomain.BaseDirectory+"/logs";
LogManager.Event+=info =>
{
    //todo:註冊一些事件操作
};
LogManager.Info("記錄一次消息");
LogManager.Error(new Exception("異常消息"));

16.FTP 客戶端

FtpClient ftpClient = FtpClient.GetAnonymousClient("192.168.2.2");//創建一個匿名訪問的客戶端
//FtpClient ftpClient = FtpClient.GetClient("192.168.2.3","admin","123456");// 創建一個帶用戶名密碼的客戶端
ftpClient.Delete("/1.txt");// 刪除文件
ftpClient.Download("/test/2.txt","D:\\test\\2.txt");// 下載文件
ftpClient.UploadFile("/test/22.txt","D:\\test\\22.txt",(sum, progress) =>
{
    Console.WriteLine("已上傳:"+progress*1.0/sum);
});//上傳文件並檢測進度
List<string> files = ftpClient.GetFiles("/");//列出ftp服務端文件列表
...

17. 多線程後臺下載

var mtd = new MultiThreadDownloader("https://attachments-cdn.shimo.im/yXwC4kphjVQu06rH/KeyShot_Pro_7.3.37.7z",Environment.GetEnvironmentVariable("temp"),"E:\\Downloads\\KeyShot_Pro_7.3.37.7z",8);
mtd.Configure(req =>
 {
     req.Referer = "https://masuit.com";
     req.Headers.Add("Origin", "https://baidu.com");
});
mtd.TotalProgressChanged+=(sender, e) =>
{
    var downloader = sender as MultiThreadDownloader;
    Console.WriteLine("下載進度:"+downloader.TotalProgress+"%");
    Console.WriteLine("下載速度:"+downloader.TotalSpeedInBytes/1024/1024+"MBps");
};
mtd.FileMergeProgressChanged+=(sender, e) =>
{
    Console.WriteLine("下載完成");
};
mtd.Start();//開始下載
//mtd.Pause(); // 暫停下載
//mtd.Resume(); // 繼續下載

18.Socket 客戶端操作類

var tcpClient = new TcpClient(AddressFamily.InterNetwork);
Socket socket = tcpClient.ConnectSocket(IPAddress.Any,5000);
socket.SendFile("D:\\test\\1.txt",false,i =>
{
    Console.WriteLine("已發送"+i+"%");
});

19. 加密解密

var enc="123456".MDString();// MD5加密
var enc="123456".MDString("abc");// MD5加鹽加密
var enc="123456".MDString2();// MD5兩次加密
var enc="123456".MDString2("abc");// MD5兩次加鹽加密
var enc="123456".MDString3();// MD5三次加密
var enc="123456".MDString3("abc");// MD5三次加鹽加密

string aes = "123456".AESEncrypt();// AES加密爲密文
string s = aes.AESDecrypt(); //AES解密爲明文
string aes = "123456".AESEncrypt("abc");// AES密鑰加密爲密文
string s = aes.AESDecrypt("abc"); //AES密鑰解密爲明文

string enc = "123456".DesEncrypt();// DES加密爲密文
string s = enc.DesDecrypt(); //DES解密爲明文
string enc = "123456".DesEncrypt("abcdefgh");// DES密鑰加密爲密文
string s = enc.DesDecrypt("abcdefgh"); //DES密鑰解密爲明文

RsaKey rsaKey = RsaCrypt.GenerateRsaKeys();// 生成RSA密鑰對
string encrypt = "123456".RSAEncrypt(rsaKey.PublicKey);// 公鑰加密
string s = encrypt.RSADecrypt(rsaKey.PrivateKey);// 私鑰解密

string s = "123".Crc32();// 生成crc32摘要
string s = "123".Crc64();// 生成crc64摘要

20. 實體校驗

public class MyClass
{
    [IsEmail] //可在appsetting.json中添加EmailDomainWhiteList配置郵箱域名白名單,逗號分隔
    public string Email { get; set; }

    [IsPhone]
    public string PhoneNumber { get; set; }

    [IsIPAddress]
    public string IP { get; set; }

    [MinValue(0, ErrorMessage = "年齡最小爲0歲"), MaxValue(100, ErrorMessage = "年齡最大100歲")]
    public int Age { get; set; }

    [ComplexPassword]//密碼複雜度校驗
    public string Password { get; set; }
}

21.HTML 操作

List<string> srcs = "html".MatchImgSrcs().ToList();// 獲取html字符串裏所有的img標籤的src屬性
var imgTags = "html".MatchImgTags();//獲取html字符串裏的所有的img標籤
var str="html".RemoveHtmlTag(); // 去除html標籤
...

22.DateTime 擴展

double milliseconds = DateTime.Now.GetTotalMilliseconds();// 獲取毫秒級時間戳
double microseconds = DateTime.Now.GetTotalMicroseconds();// 獲取微秒級時間戳
double nanoseconds = DateTime.Now.GetTotalNanoseconds();// 獲取納秒級時間戳
double seconds = DateTime.Now.GetTotalSeconds();// 獲取秒級時間戳
double minutes = DateTime.Now.GetTotalMinutes();// 獲取分鐘級時間戳
...

23.IP 地址和 URL

bool inRange = "192.168.2.2".IpAddressInRange("192.168.1.1","192.168.3.255");// 判斷IP地址是否在這個地址段裏
bool isPrivateIp = "172.16.23.25".IsPrivateIP();// 判斷是否是私有地址
bool isExternalAddress = "http://baidu.com".IsExternalAddress();// 判斷是否是外網的URL

//以下需要配置baiduAK
string isp = "114.114.114.114".GetISP(); // 獲取ISP運營商信息
PhysicsAddress physicsAddress = "114.114.114.114".GetPhysicsAddressInfo().Result;// 獲取詳細地理信息對象
Tuple<string, List<string>> ipAddressInfo = "114.114.114.114".GetIPAddressInfo().Result;// 獲取詳細地理信息集合

24. 元素去重

var list = new List<MyClass>()
{
    new MyClass()
    {
        Email = "1@1.cn"
    },
    new MyClass()
    {
        Email = "1@1.cn"
    },
    new MyClass()
    {
        Email = "1@1.cn"
    }
};
List<MyClass> classes = list.DistinctBy(c => c.Email).ToList();
Console.WriteLine(classes.Count==1);//True

25. 枚舉擴展

public enum MyEnum
{
    [Display(Name = "讀")]
    [Description("讀")]
    Read,
    
    [Display(Name = "寫")]
    [Description("寫")]
    Write
}
Dictionary<int, string> dic1 = typeof(MyEnum).GetDictionary();// 獲取枚舉值和字符串表示的字典映射
var dic2 = typeof(MyEnum).GetDescriptionAndValue();// 獲取字符串表示和枚舉值的字典映射
string desc = MyEnum.Read.GetDescription();// 獲取Description標籤
string display = MyEnum.Read.GetDisplay();// 獲取Display標籤的Name屬性
var value = typeof(MyEnum).GetValue("Read");//獲取字符串表示值對應的枚舉值
string enumString = 0.ToEnumString(typeof(MyEnum));// 獲取枚舉值對應的字符串表示

26. 定長隊列實現

LimitedQueue<string> queue = new LimitedQueue<string>(32);// 聲明一個容量爲32個元素的定長隊列
ConcurrentLimitedQueue<string> queue = new ConcurrentLimitedQueue<string>(32);// 聲明一個容量爲32個元素的線程安全的定長隊列

27. 反射操作

MyClass myClass = new MyClass();
PropertyInfo[] properties = myClass.GetProperties();// 獲取屬性列表
myClass.SetProperty("Email","1@1.cn");//給對象設置值

28. 獲取線程內唯一對象

CallContext<T>.SetData("db",dbContext);//設置線程內唯一對象
CallContext<T>.GetData("db");//獲取線程內唯一對象

29.asp.net core 獲取靜態的 HttpContext 對象

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddStaticHttpContext();
    // ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // ...
    app.UseStaticHttpContext();
    // ...
}
public async Task<IActionResult> Index()
{
    HttpContext context = HttpContext2.Current;
}

30. 郵件發送

new Email()
{
    SmtpServer = "smtp.masuit.com",// SMTP服務器
    SmtpPort = 25, // SMTP服務器端口
    EnableSsl = true,//使用SSL
    Username = "admin@masuit.com",// 郵箱用戶名
    Password = "123456",// 郵箱密碼
    Tos = "10000@qq.com,10001@qq.com", //收件人
    Subject = "測試郵件",//郵件標題
    Body = "你好啊",//郵件內容
}.SendAsync(s =>
{
    Console.WriteLine(s);// 發送成功後的回調
});// 異步發送郵件

31. 圖像的簡單處理

ImageUtilities.CompressImage(@"F:\src\1.jpg", @"F:\dest\2.jpg");//無損壓縮圖片

"base64".SaveDataUriAsImageFile();// 將Base64編碼轉換成圖片

Image image = Image.FromFile(@"D:\1.jpg");
image.MakeThumbnail(@"D:\2.jpg", 120, 80, ThumbnailCutMode.LockWidth);//生成縮略圖

Bitmap bmp = new Bitmap(@"D:\1.jpg");
Bitmap newBmp = bmp.BWPic(bmp.Width, bmp.Height);//轉換成黑白
Bitmap newBmp = bmp.CutAndResize(new Rectangle(0, 0, 1600, 900), 160, 90);//裁剪並縮放
bmp.RevPicLR(bmp.Width, bmp.Height);//左右鏡像
bmp.RevPicUD(bmp.Width, bmp.Height);//上下鏡像

32. 隨機數

Random rnd = new Random();
int num = rnd.StrictNext();//產生真隨機數
double gauss = rnd.NextGauss(20,5);//產生正態分佈的隨機數

33. 權重篩選功能

var data=new List<WeightedItem<string>>()
{
     new WeightedItem<string>("A", 1),
     new WeightedItem<string>("B", 3),
     new WeightedItem<string>("C", 4),
     new WeightedItem<string>("D", 4),
};
var item=data.WeightedItem();//按權重選出1個元素
var list=data.WeightedItems(2);//按權重選出2個元素
var selector = new WeightedSelector<string>(new List<WeightedItem<string>>()
{
    new WeightedItem<string>("A", 1),
    new WeightedItem<string>("B", 3),
    new WeightedItem<string>("C", 4),
    new WeightedItem<string>("D", 4),
});
var item = selector.Select();//按權重選出1個元素
var list = selector.SelectMultiple(3);//按權重選出3個元素

34.EF Core 支持 AddOrUpdate 方法

/// <summary>
/// 按Id添加或更新文章實體
/// </summary>
public override Post SavePost(Post t)
{
    DataContext.Set<Post>().AddOrUpdate(t => t.Id, t);
    return t;
}

35. 敏感信息掩碼

"13123456789".Mask(); // 131****5678
"admin@masuit.com".MaskEmail(); // a****n@masuit.com

36. 集合擴展

var list = new List<string>()
{
    "1","3","3","3"
};
list.AddRangeIf(s => s.Length > 1, "1", "11"); // 將被添加元素中的長度大於1的元素添加到list
list.AddRangeIfNotContains("1", "11"); // 將被添加元素中不包含的元素添加到list
list.RemoveWhere(s => s.Length<1); // 將集合中長度小於1的元素移除
list.InsertAfter(0, "2"); // 在第一個元素之後插入
list.InsertAfter(s => s == "1", "2"); // 在元素"1"後插入
var dic = list.ToDictionarySafety(s => s); // 安全的轉換成字典類型,當鍵重複時只添加一個鍵
var dic = list.ToConcurrentDictionary(s => s); // 轉換成併發字典類型,當鍵重複時只添加一個鍵
var dic = list.ToDictionarySafety(s => s, s => s.GetHashCode()); // 安全的轉換成字典類型,當鍵重複時只添加一個鍵
dic.AddOrUpdate("4", 4); // 添加或更新鍵值對
dic.AddOrUpdate(new Dictionary<string, int>()
{
    ["5"] = 5,["55"]=555
}); // 批量添加或更新鍵值對
dic.AddOrUpdate("5", 6, (s, i) => 66); // 如果是添加,則值爲6,若更新則值爲66
dic.AddOrUpdate("5", 6, 666); // 如果是添加,則值爲6,若更新則值爲666
dic.AsConcurrentDictionary(); // 普通字典轉換成併發字典集合
var table=list.ToDataTable(); // 轉換成DataTable類型
table.AddIdentityColumn(); //給DataTable增加一個自增列
table.HasRows(); // 檢查DataTable 是否有數據行
table.ToList<T>(); // datatable轉List
var set = list.ToHashSet(s=>s.Name);// 轉HashSet

37.Mime 類型

var mimeMapper = new MimeMapper();
var mime = mimeMapper.GetExtensionFromMime("image/jpeg"); // .jpg
var ext = mimeMapper.GetMimeFromExtension(".jpg"); // image/jpeg

38. 日期時間擴展

DateTime.Now.GetTotalSeconds(); // 獲取該時間相對於1970-01-01 00:00:00的秒數
DateTime.Now.GetTotalMilliseconds(); // 獲取該時間相對於1970-01-01 00:00:00的毫秒數
DateTime.Now.GetTotalMicroseconds(); // 獲取該時間相對於1970-01-01 00:00:00的微秒數
DateTime.Now.GetTotalNanoseconds(); // 獲取該時間相對於1970-01-01 00:00:00的納秒數
var indate=DateTime.Parse("2020-8-3").In(DateTime.Parse("2020-8-2"),DateTime.Parse("2020-8-4"));//true

//時間段計算工具
var range = new DateTimeRange(DateTime.Parse("2020-8-3"), DateTime.Parse("2020-8-5"));
range.Union(DateTime.Parse("2020-8-4"), DateTime.Parse("2020-8-6")); //連接兩個時間段,結果:2020-8-3~2020-8-6
range.In(DateTime.Parse("2020-8-3"), DateTime.Parse("2020-8-6"));//判斷是否在某個時間段內,true
var (intersected,range2) = range.Intersect(DateTime.Parse("2020-8-4"), DateTime.Parse("2020-8-6"));//兩個時間段是否相交,(true,2020-8-3~2020-8-4)
range.Contains(DateTime.Parse("2020-8-3"), DateTime.Parse("2020-8-4"));//判斷是否包含某個時間段,true
...

39. 流轉換

stream.SaveAsMemoryStream(); // 任意流轉換成內存流
stream.ToArray(); // 任意流轉換成二進制數組

40. 數值轉換

1.2345678901.Digits8(); // 將小數截斷爲8位
1.23.To<int>(); // 小數轉int
1.23.To<T>(); // 小數轉T基本類型

41. 簡繁轉換

var str="個體".ToTraditional(); // 轉繁體
var str="個體".ToSimplified(); // 轉簡體

Asp.Net MVC 和 Asp.Net Core 的支持斷點續傳和多線程下載的 ResumeFileResult

在 ASP.NET Core 中通過 MVC/WebAPI 應用程序傳輸文件數據時使用斷點續傳以及多線程下載支持。

它提供了ETag標頭以及Last-Modified標頭。它還支持以下前置條件標頭:If-MatchIf-None-MatchIf-Modified-SinceIf-Unmodified-SinceIf-Range

支持 ASP.NET Core 2.0+

從. NET Core2.0 開始,ASP.NET Core 內部支持斷點續傳。因此只是對 FileResult 做了一些擴展。只留下了 “Content-Disposition” Inline 的一部分。所有代碼都依賴於基礎. NET 類。

如何使用

.NET Framework

在你的控制器中,你可以像在FileResult一樣的方式使用它。

using Masuit.Tools.Mvc;
using Masuit.Tools.Mvc.ResumeFileResult;
private readonly MimeMapper mimeMapper=new MimeMapper(); // 推薦使用依賴注入

public ActionResult ResumeFileResult()
{
    var path = Server.MapPath("~/Content/test.mp4");
    return new ResumeFileResult(path, mimeMapper.GetMimeFromPath(path), Request);
}

public ActionResult ResumeFile()
{
    return this.ResumeFile("~/Content/test.mp4", mimeMapper.GetMimeFromPath(path), "test.mp4");
}

public ActionResult ResumePhysicalFile()
{
    return this.ResumePhysicalFile(@"D:/test.mp4", mimeMapper.GetMimeFromPath(@"D:/test.mp4"), "test.mp4");
}

Asp.Net Core

要使用 ResumeFileResults,必須在Startup.csConfigureServices方法調用中配置服務:

using Masuit.Tools.AspNetCore.ResumeFileResults.Extensions;
public void ConfigureServices(IServiceCollection services)
{
    services.AddResumeFileResult();
}

然後在你的控制器中,你可以像在FileResult一樣的方式使用它。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/TbhzcaaV08qjVER3QrqJ5w