zl程序教程

您现在的位置是:首页 >  .Net

当前栏目

篇(13)-Asp.Net Core入门实战-将功能代码增加异步功能Async和配置简单防范CSRF攻击

2023-02-18 15:31:13 时间

入门实战-将功能代码增加异步功能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步简单的配置即可

  1. 在View视图页面,增加 @Html.AntiForgeryToken()
  2. 在Controller的Action声明上,增加[ValidateAntiForgeryToken]的声明,如下图

  1. 关于通过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('删除失败');
}
});