入門實戰-將功能代碼增加異步功能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 = "https://www.cnblogs.com/Article/Index";
},
failure: function (data, error) {
alert('洗掉失敗');
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/536165.html
標籤:.NET技术
