您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。