C# 快速单击“提交”按钮时,服务器验证未按预期工作
我正在检查.netcore webapi项目中服务器函数中的重复名称验证,但当从UI快速单击“保存”按钮时,服务器处理并行请求并在数据库中输入相同的名称。我知道这可以避免在数据库中设置约束,但有没有其他解决方案,因为当我们在服务器中处理一个巨大的逻辑验证时,在保存其他函数之前,同样的情况也会发生C# 快速单击“提交”按钮时,服务器验证未按预期工作,c#,asp.net-core,asp.net-web-api,C#,Asp.net Core,Asp.net Web Api,我正在检查.netcore webapi项目中服务器函数中的重复名称验证,但当从UI快速单击“保存”按钮时,服务器处理并行请求并在数据库中输入相同的名称。我知道这可以避免在数据库中设置约束,但有没有其他解决方案,因为当我们在服务器中处理一个巨大的逻辑验证时,在保存其他函数之前,同样的情况也会发生 public async Task<ReturnMessageMain> Create(CreateOrEditMainCategoryDto input) {
public async Task<ReturnMessageMain> Create(CreateOrEditMainCategoryDto input)
{
if (_mainCategoryRepository.GetAll().Where(x => x.MainGroup == input.MainGroup.Trim()).Count() > 0)
{
throw new UserFriendlyException("Main Category already exists");
}
var mainCategory = ObjectMapper.Map<MainCategory>(input);
int id = await _mainCategoryRepository.InsertAndGetIdAsync(mainCategory);
if (id > 0)
{
return new ReturnMessageMain()
{
Id = id,
Code = input.MainGroupCode,
Message = "Saved Successfully"
};
}
else
{
return new ReturnMessageMain()
{
Id = 0,
// Code = input.MainGroupCode,
Message = "Please try again"
};
}
}
公共异步任务创建(CreateOreDitMainCategoryTo输入)
{
if(_mainCategoryRepository.GetAll().Where(x=>x.MainGroup==input.MainGroup.Trim()).Count()>0)
{
抛出新的UserFriendlyException(“主类别已存在”);
}
var maincegory=ObjectMapper.Map(输入);
int id=await_mainCategoryRepository.InsertAndGetIdAsync(maincodel);
如果(id>0)
{
返回新的ReturnMessageMain()
{
Id=Id,
代码=input.MainGroupCode,
Message=“保存成功”
};
}
其他的
{
返回新的ReturnMessageMain()
{
Id=0,
//代码=input.MainGroupCode,
Message=“请重试”
};
}
}
当用户多次单击“保存”按钮,然后多次调用“创建”功能时,这会导致问题,我们可以禁用“提交”按钮,但这只是客户端的一种方法,我们如何从服务器端处理此问题,即使有办法在单台服务器级别停止此操作,考虑一组独立的应用服务器,其中每个并行请求由不同的服务器处理。唯一可靠的解决方案是数据库中的唯一约束。您可能需要查看.NETFramework提供的<代码>锁< /COD>语句。我们在电子商务站点@ Wikor ZyChLA中使用它,但是考虑到检查数据库中的项目的情况,那么我们如何处理这个问题呢?您应该在服务器端和客户端100%检查这个问题,这样即使用户点击按钮并绕过JS验证,服务器也会捕获它并返回相应的错误。@scgough我正在签入服务器,但问题是并行请求。