這篇文章將為大家詳細講解有關(guān)ASP.NET 中怎么利用WebApi服務(wù)接口防止重復(fù)請求,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
為自流井等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及自流井網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計、做網(wǎng)站、自流井網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
2.1、什么是重復(fù)提交?
在平時開發(fā)中,如果網(wǎng)速比較慢的情況下,用戶提交表單后,發(fā)現(xiàn)服務(wù)器半天都沒有響應(yīng),那么用戶可能會以為是自己沒有提交表單,就會再點擊提交按鈕重復(fù)提交表單,我們在開發(fā)中必須防止表單重復(fù)提交,這些邏輯都需要冪等的特性來支持。
2.2、什么是HTTP冪等性?
冪等性(Idempotent)是一個數(shù)學(xué)上的概念,表達的是N次變換與1次變換的結(jié)果相同;冪等性的數(shù)學(xué)表達:f(f(x)) = f(x)。
站在我們接口的角度講,冪等性指的是擁有相同參數(shù)的多次請求對系統(tǒng)造成的副作用應(yīng)該是相同的。
一、以RestFul API為例,有下面四種場景:
1)、HTTP GET方法用于獲取資源,不應(yīng)有副作用,所以是冪等的。比如:GET http://www.bank.com/account/123456,不會改變資源的狀態(tài),不論調(diào)用一次還是N次都沒有副作用。
2)、HTTP DELETE方法用于刪除資源,有副作用,但它應(yīng)該滿足冪等性。比如:DELETE http://www.forum.com/article/4231
3)、HTTP POST方法用于創(chuàng)建資源,所對應(yīng)的URI并非創(chuàng)建的資源本身,而是去執(zhí)行創(chuàng)建動作的操作者,有副作用,不滿足冪等性。
4)、HTTP PUT方法用于創(chuàng)建或更新操作,所對應(yīng)的URI是要創(chuàng)建或更新的資源本身,有副作用,它應(yīng)該滿足冪等性。
二、以SQL為例,有下面三種場景,只有第三種場景需要開發(fā)人員使用其他策略保證冪等性:
1)、SELECT col1 FROM tab1 WHER col2=2,無論執(zhí)行多少次都不會改變狀態(tài),是天然的冪等。
2)、UPDATE tab1 SET col1=1 WHERE col2=2,無論執(zhí)行成功多少次狀態(tài)都是一致的,因此也是冪等操作。
3)、UPDATE tab1 SET col1=col1+1 WHERE col2=2,每次執(zhí)行的結(jié)果都會發(fā)生變化,這種不是冪等的。
以上只是簡單的舉例,具體的還是要根據(jù)大家自己的業(yè)務(wù)場景來分析,總之要保證一點的就是我們的那些請求或數(shù)據(jù)業(yè)務(wù)是不允許出現(xiàn)非冪等性操作的!
3.1、 如何防止Web表單POST重復(fù)請求
●利用Session防止表單重復(fù)提交(推薦的實現(xiàn)Web表單重復(fù)提交解決手段)
實現(xiàn) 基本處理思路步驟如下:
1.)、在頁面生成時,比如說Index的Action中,開啟一個SESSION,存儲一個唯一的值(一般.net中使用的是Guid.NewGuid()這個方法)。
2.)、同時在隱藏文本域中存儲SESSION中的這個值。
3.)、Post的時候,POST到另一個Action中,這個Action不重新生成SESSION,只是將現(xiàn)有的SESSION與提交的隱藏文本框中的數(shù)據(jù)進行對比。如果一致,則為正確提交。不一致,則進行異常處理。
參考文章值得一看:https://www.cnblogs.com/xdp-gacl/p/3859416.html
3.2、如何防止WebApi接口重復(fù)請求
●利用分布式事務(wù)設(shè)計
在以前的單應(yīng)用系統(tǒng)中,我們只需要把數(shù)據(jù)操作放入事務(wù)中即可,發(fā)生錯誤立即回滾,但是再響應(yīng)客戶端的時候也有可能出現(xiàn)網(wǎng)絡(luò)中斷或者異常等等,所有單應(yīng)用系統(tǒng)中不存在冪等性的問題。而在分布式系統(tǒng)中為了解決冪等性問題,可以采用分布式事務(wù)。
雖然分布式事務(wù)優(yōu)點是對于調(diào)用者很簡單,復(fù)雜性都交給了中間件來管理。缺點則是一方面架構(gòu)太重量級,容易被綁在特定的中間件上,不利于異構(gòu)系統(tǒng)的集成;另一方面分布式事務(wù)雖然能保證事務(wù)的ACID性質(zhì),而但卻無法提供性能和可用性的保證。
比如:使用zookeeper/etcd等分布式協(xié)調(diào)服務(wù),可以解決此問題。
●基于redis的API接口HTTP冪等性設(shè)計(推薦解決手段)
實現(xiàn)基本思路步驟如下:
1)、客戶端請求獲取門票。
2)、調(diào)用服務(wù)方法,傳入門票 。
3)、服務(wù)端根據(jù)門票ID查詢此次操作是否存在,如果存在則表示該操作已經(jīng)執(zhí)行過,直接返回結(jié)果;如果不存在,則執(zhí)行處理,將處理的結(jié)果保存起來(處理的結(jié)果可能是成功狀態(tài)和失敗狀態(tài))。
4)、返回結(jié)果到客戶端。
如果步驟4通信失敗(之所以要處理HTTP冪等性問題,就是因為一些網(wǎng)絡(luò)原因?qū)е抡{(diào)用方在指定的時間內(nèi)不能獲取當(dāng)前請求的執(zhí)行響應(yīng)結(jié)果才導(dǎo)致客戶端重復(fù)提交請求。),用戶再次發(fā)起請求,那么最終結(jié)果還是一樣的。
兩種實現(xiàn)方式
關(guān)于ASP.NET 中怎么利用WebApi服務(wù)接口防止重復(fù)請求就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。