篇(13)-Asp.Net Core入门实战-将功能代码增加异步功能Async和配置简单防范CSRF攻击
入门实战-将功能代码增加异步功能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('删除失败');
}
});