【經驗分享】ASP.NET 的 Page_Load 執行了2次,真的(啟用了表單驗證Form Authentication)!
發現問題
這是來自一位網友的提問:
本著求真務實的態度,我打開了 AppBoxPro 專案,本地除錯果然發現 Page_Load 進入了兩次!
其實在沒測試之前,我就有了大概的方向,因為AppBoxPro是需要先登入的,莫非因為許可權問題被重定向了一次,但是F12開啟除錯視窗,發現請求的的確確只有一個:
分析問題
之前好像也遇到過類似的問題,貌似是圖片標籤設了空的src屬性導致的( <img src="">),網上查了一下,的確有很多人遇到這個問題。
比如這個帖子:https://www.cnblogs.com/Simcoder/archive/2011/12/01/2270256.html
但是我在頁面上檢查了一遍,雖然有 img 標籤,但是其 src 屬性都不為空!
沒辦法,還是除錯看看引數吧,畢竟兩次進入 Page_Load 總該有所不同吧,來看下請求的URL:
果然發現問題,解碼後第二次的請求URL是:http://localhost:7086/default.aspx?ReturnUrl=/__browserLink/requestData/e176fc91b6574240afa3a4f0f95e9ebd?version=2&version=2
看到其中的 __browserLink 我好像突然明白了,這個不就是 Visual Studio 提供的一個工具嘛,好像是 VS2013 之後才引入的,可以讓使用者在VS中點選重新整理按鈕直接重新整理相應的瀏覽器視窗,不過我對這玩意不感冒,從來不用過罷了。
開啟頁面原始碼,就能看到這個請求來自何處了:
解決問題
知道問題的根源,解決起來就很簡單了,這裡有兩個方法。
第一種方法簡單粗暴,直接禁用VS Browser Link,反正我也沒用過:
第二種方法是給 VS Browser Link 放行,這個根本不需要進行身份認證,和網站的靜態資源做同樣的處理,修改Web.config檔案:
<location path="icon"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location> <location path="res"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location> <location path="res.axd"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location> <location path="__browserLink"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location>
注意,上面的 __browserLink 配置項就是我們新增的!
搞定!
等等
好像有點問題,既然是一個被攔截的 URL:http://localhost:7086/default.aspx?ReturnUrl=/__browserLink/requestData/e176fc91b6574240afa3a4f0f95e9ebd?version=2&version=2
為啥前面的 F12 看不到這個請求,這個不合理吧!
的確如此,既然是一個HTTP請求,就不可能逃出 F12 的監控,我們再次執行頁面,發現這個請求卻原來是一個 AJAX 請求:
前面我們使用 Doc 過濾項,自然是看不到這個 AJAX 請求了。
至此,問題完美解決。
不忘初心,砥礪前行!