一 演算法複雜度 演算法複雜度分為時間複雜度和空間複雜度。時間複雜度是指執行演算法所需要的計算工作量;而空間複雜度是指執行這個演算法所需要的記憶體空間。 演算法的複雜性體運行該演算法時的電腦所需資源的多少,電腦資源最重要的是時間和空間(即寄存器)資源,因此複雜度分為時間和空間複雜度。 二 時間複雜度 2.1 ...
入門實戰-將功能代碼增加非同步功能Async和配置簡單防範CSRF攻擊
關於Asp.Net Core的新特性 Async,非同步,還是需要掌握的,這個特性,按微軟官方的說法是可以提高你伺服器的負荷,可以提供更多的服務請求,多用在資料庫、文件、Web介面等功能時,必定微軟搞的.Net Core,不僅是跨平臺,也能支持大型項目研發部署。
我還以Menu功能為例,來對代碼進行修改。先需要修改IMenuService.cs介面類的類型聲明;
(1).使用方法是現在函數返回類型上聲明Task<>,如下
(2).在繼承類里,實現函數的代碼時,寫法如下
public class MenuService : IMenuService { private readonly AppDbContext _appDbContext; public MenuService(AppDbContext appDbContext) { _appDbContext = appDbContext; } public async Task<bool> AddMenuAsync(Menu menu) { menu.IsDelete = false; menu.AddManagerId = 1;//用戶id,可讀取Cookie、Session或Claims內用戶Id menu.AddTime = DateTime.Now; menu.IsSystem = true; _appDbContext.Menu.Add(menu); var result = await _appDbContext.SaveChangesAsync(); return result == 1;//註意(result==1 如果等式成立,則返回true,說明刪除成功) } public async Task<bool> DeleteMenuAsync(int Id) { var delMenu = await _appDbContext.Menu.FirstOrDefaultAsync(x => x.Id == Id); if (delMenu != null) { _appDbContext.Menu.Remove(delMenu); } var result = await _appDbContext.SaveChangesAsync(); return result == 1; //註意(result==1 如果等式成立,則返回true,說明刪除成功) } public async Task<Menu> FindMenuAsync(int Id) { var item = await _appDbContext.Menu.Where(x => x.Id == Id).FirstOrDefaultAsync(); return item; } public async Task<bool> UpdateMenuAsync(int id, Menu menu) { var oldMenu = await FindMenuAsync(id); //找出舊對象 //將新值賦到舊對象上 oldMenu.Name = menu.Name; oldMenu.ParentId = menu.ParentId; oldMenu.DisplayName = menu.DisplayName; oldMenu.Sort = menu.Sort; oldMenu.LinkUrl = menu.LinkUrl; oldMenu.ModifyManagerId = 11;// oldMenu.ModifyTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); //對舊對象執行更新 _appDbContext.Entry(oldMenu).State = EntityState.Modified; var result = await _appDbContext.SaveChangesAsync(); return result == 1;//註意(result==1 如果等式成立,則返回true,說明刪除成功) } }
(3).在Controller中的修改方法如下,註意調用非同步方法是首碼有await 關鍵字,調用EF框架自身的非同步函數,例如,在var item = await _appDbContext.Menu.Where(x => x.Id == Id).FirstOrDefaultAsync();這行代碼中,FirstOrDefaultAsync(),就是預設的非同步方法,回看上一章節,發現就是多了一個Async的尾碼;
關於await和async網路上都有詳細的解釋,各位初學者可以邊操作邊看理論,有人是理論派,必須搞清楚才會動手寫代碼,而我是個動手派,先仿照著寫,邊寫邊學邊理解。回過了頭來相互印證一下。
二.關於CSRF(跨站攻擊)
在Asp.Net Core 的進行2步簡單的配置即可
- 在View視圖頁面,增加 @Html.AntiForgeryToken()
- 在Controller的Action聲明上,增加[ValidateAntiForgeryToken]的聲明,如下圖
- 關於通過Js(Jquery的Ajax)提交請求時,請求驗證在Header中以隱藏變數的方式聲明並提交,它的一種寫法是這樣的(註意請求的Action的ValidateAntiForgeryToken聲明不可少):
$.ajax({
type: "POST",
url: "/Article/Edit",//表示請求Action地址
data: { articleid: ArticleId},
beforeSend: function (xhr) {
xhr.setRequestHeader("RequestVerificationToken",
$('input:hidden[name="__RequestVerificationToken"]').val());
},
success: function (res) {
alert('設置成功!');
//window.location.href = "/Article/Index";
},
failure: function (data, error) {
alert('刪除失敗');
}
});