这篇文章将为大家详细讲解有关ASP.NET 中怎么利用WebApi服务接口防止重复请求,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
2.1、什么是重复提交?
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交,这些逻辑都需要幂等的特性来支持。
2.2、什么是HTTP幂等性?
幂等性(Idempotent)是一个数学上的概念,表达的是N次变换与1次变换的结果相同;幂等性的数学表达:f(f(x)) = f(x)。
站在我们接口的角度讲,幂等性指的是拥有相同参数的多次请求对系统造成的副作用应该是相同的。
一、以RestFul API为例,有下面四种场景:
1)、HTTP GET方法用于获取资源,不应有副作用,所以是幂等的。比如:GET http://www.bank.com/account/123456,不会改变资源的状态,不论调用一次还是N次都没有副作用。
2)、HTTP DELETE方法用于删除资源,有副作用,但它应该满足幂等性。比如:DELETE http://www.forum.com/article/4231
3)、HTTP POST方法用于创建资源,所对应的URI并非创建的资源本身,而是去执行创建动作的操作者,有副作用,不满足幂等性。
4)、HTTP PUT方法用于创建或更新操作,所对应的URI是要创建或更新的资源本身,有副作用,它应该满足幂等性。
二、以SQL为例,有下面三种场景,只有第三种场景需要开发人员使用其他策略保证幂等性:
1)、SELECT col1 FROM tab1 WHER col2=2,无论执行多少次都不会改变状态,是天然的幂等。
2)、UPDATE tab1 SET col1=1 WHERE col2=2,无论执行成功多少次状态都是一致的,因此也是幂等操作。
3)、UPDATE tab1 SET col1=col1+1 WHERE col2=2,每次执行的结果都会发生变化,这种不是幂等的。
以上只是简单的举例,具体的还是要根据大家自己的业务场景来分析,总之要保证一点的就是我们的那些请求或数据业务是不允许出现非幂等性操作的!
3.1、 如何防止Web表单POST重复请求
●利用Session防止表单重复提交(推荐的实现Web表单重复提交解决手段)
实现 基本处理思路步骤如下:
1.)、在页面生成时,比如说Index的Action中,开启一个SESSION,存储一个唯一的值(一般.net中使用的是Guid.NewGuid()这个方法)。
2.)、同时在隐藏文本域中存储SESSION中的这个值。
3.)、Post的时候,POST到另一个Action中,这个Action不重新生成SESSION,只是将现有的SESSION与提交的隐藏文本框中的数据进行对比。如果一致,则为正确提交。不一致,则进行异常处理。
参考文章值得一看:https://www.cnblogs.com/xdp-gacl/p/3859416.html
3.2、如何防止WebApi接口重复请求
●利用分布式事务设计
在以前的单应用系统中,我们只需要把数据操作放入事务中即可,发生错误立即回滚,但是再响应客户端的时候也有可能出现网络中断或者异常等等,所有单应用系统中不存在幂等性的问题。而在分布式系统中为了解决幂等性问题,可以采用分布式事务。
虽然分布式事务优点是对于调用者很简单,复杂性都交给了中间件来管理。缺点则是一方面架构太重量级,容易被绑在特定的中间件上,不利于异构系统的集成;另一方面分布式事务虽然能保证事务的ACID性质,而但却无法提供性能和可用性的保证。
比如:使用zookeeper/etcd等分布式协调服务,可以解决此问题。
●基于Redis的API接口HTTP幂等性设计(推荐解决手段)
实现基本思路步骤如下:
1)、客户端请求获取门票。
2)、调用服务方法,传入门票 。
3)、服务端根据门票ID查询此次操作是否存在,如果存在则表示该操作已经执行过,直接返回结果;如果不存在,则执行处理,将处理的结果保存起来(处理的结果可能是成功状态和失败状态)。
4)、返回结果到客户端。
如果步骤4通信失败(之所以要处理HTTP幂等性问题,就是因为一些网络原因导致调用方在指定的时间内不能获取当前请求的执行响应结果才导致客户端重复提交请求。),用户再次发起请求,那么最终结果还是一样的。
两种实现方式
关于ASP.NET 中怎么利用WebApi服务接口防止重复请求就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。