十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章将为大家详细讲解有关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服务接口防止重复请求就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。