ARR - 為某些請求動態禁用磁碟記憶體(經過身份驗證的使用者)
這是關於應用程序請求路由和動態禁用某些請求的磁碟記憶體(請求來自經過身份驗證的使用者;它們是否經過身份驗證可以由自定義程式碼決定)。
在我的設置中,有一個執行 ARR 的伺服器,將請求分派到不同伺服器上的 ASP.NET MVC 站點。該站點使用表單身份驗證(有時是 HTTP 基本身份驗證),因此身份驗證發生在 MVC 站點上,而不是在 ARR 中:基本上,當使用者進行身份驗證時,站點會創建一個表單身份驗證 cookie。
我希望在 ARR 中發生以下情況:
- 為匿名使用者做輸出記憶體。
- 對於經過身份驗證的使用者,僅記憶體靜態文件(例如 .css、、.js、.jpg 文件),不記憶體動態頁面。
這種情況下怎麼可能有記憶體配置規則呢?我嘗試了多種方法:
- 記憶體頭:MVC 應用程序發送的記憶體控制頭在這裡不可用,因為想像一下:第 1 頁在 ARR 的記憶體中。使用者驗證並訪問頁面 1。MVC 應用程序將發送一個 no-cache 標頭,但請求未到達它,因此使用者獲取記憶體版本。
- 無記憶體 URL:儘管我可能定義了不應記憶體其中包含“no-arr-cache”的 URL 將與 URL 重寫一起使用,即使用自定義 URL 重寫提供程序我會將經過身份驗證的請求重寫為…?無 arr 記憶體。除了不關心查詢字元串的 ARR 記憶體控制規則之外,問題在於 ARR 在評估記憶體配置規則時只考慮請求的 URL,而不是重寫的 URL。
先感謝您!
我從IIS 論壇交叉發布了這個,因為那裡沒有人回复。
這就是我解決它的方法。
我們必須牢記以下前提:
- ARR 使用其 URL 標識記憶體項(根據配置,包括查詢字元串;這應該是配置)。
- 在請求期間,可以指示 ARR 不記憶體目前請求的輸出。
- 如果目前請求的(URL)輸出之前被記憶體,那麼我不知道如何指示 ARR 不要使用記憶體的版本。
最重要的想法是更改請求的 URL,或者更確切地說,根據使用者是否經過身份驗證,使用 IIS URL 重寫以不同方式重寫它。未經身份驗證的使用者使用 /my-page?authenticated=false 獲取所有頁面,使用 /my-page?authenticated=true 獲取經過身份驗證的頁面。頁面將僅為匿名使用者記憶體,因此 ARR 不會為經過身份驗證的使用者找到任何匹配的記憶體條目。這樣,第三點就解決了。不利的一面是,附加到 URL 的查詢字元串可能會出現在 HTML 正文中,應該使用 IIS URL Rewrite 去除這些字元串。
要指示 ARR 不記憶體目前請求,請將 ARR_CACHE_CONTROL_OVERRIDE 伺服器變數設置為“1,no-cache”(您可以通過重寫規則執行此操作)。
您可以檢測使用者是否通過 IIS URL Rewrite IRewriteProvider 進行了身份驗證(請參閱教程),即您可以使用此類提供程序的輸出為經過身份驗證的使用者和匿名使用者以不同的方式重寫 URL。
希望對某人有所幫助。