我使用服务堆栈来接受向后端数据库添加行的http请求,相当标准的东西。我现在遇到的问题是,有时,设备向服务发送数据,相隔毫秒发送相同的请求。这会导致数据库约束错误,因为第一个请求仍在插入新行等等
所以,我认为我需要找到一种检测重复请求的方法,然后忽略它或将HttpError抛回客户端。我现在的想法是将完整的原始POST数据存储到临时表中,并在处理完成后将其删除。在每个POST请求中,我都会在那里查找数据并忽略它是否重复。有没有更简单的方法来检测ServiceStack中的重复http请求?
答案 0 :(得分:6)
防止重复请求的常用方法是客户端发送一个唯一的代码(也就是noonce),就像Guid一样发送请求,让服务器拒绝请求,例如如果发送了具有相同代码的请求,则使用throw HttpError.Conflict("Duplicate Request")
。
如果您有多个应用服务器,我建议您将唯一代码存储在Redis设置中,否则对于将其存储在静态ConcurrentDictionary<string,bool>
或ConcurrentBag<string>
中的单个应用服务器将起作用。< / p>