[英]ServiceStack order of operations problem during the execution of a Service
我們正在將經典的 ASP.NET 應用程序從 v3.9.64 升級到 ServiceStack v5.11.0,並渴望成為 ServiceStack 的付費客戶。 但是我們必須解決這個問題。 ServiceStack 中的生命周期和操作順序發生了變化。 在由 ServiceStack 處理的請求生命周期中,有某些點HttpContext.Current
尚未填充。 我們所有的代碼都希望設置它,因此我們必須在我們的處理或請求中避免這種情況。 以下是我們認為需要的操作順序。
HttpContext.Current
必須由系統填充。AppHost: AppHostBase
允許我們初始化我們的中間層。 我們目前正在嘗試 AppHost.OnPreExecuteServiceFilter,但由於調用了插件,這被證明是有問題的。 請繼續閱讀。我們上面面臨的問題是我們的身份驗證插件在 AppHost.OnPreExecuteServiceFilter 之前被調用,因此我們的代碼失敗,因為我們還沒有初始化我們的中間層。 因此,當前第 2 步和第 3 步的順序錯誤。 我們如何解決這個問題? 在填充 HttpContext.Current 之后和調用插件之前是否會觸發不同的 AppHost 事件? 或者我們可以將我們的插件配置為在 AppHost.OnPreExecuteServiceFilter 之后調用嗎?
關於這一點的進一步說明。 在 v3.9.64 中,我們的 Global.Application_BeginRequest 和 EndRequest 事件被用於上述目的,並且始終運行良好。 我確實看到這些事件是在傳入的 ServiceStack 請求時觸發的,但它們的發生順序與過去不同,因此我們面臨這個問題。
操作順序只是在 ServiceStack 請求中執行不同掛鈎和過濾器的順序。
OnPreExecuteServiceFilter
,就是在執行服務之前執行的過濾器。
接下來,我們編寫了一個插件來執行身份驗證,該插件已添加到 AppHost.Configure 中的插件中。 我們需要在第 2 步之后調用它。
AppHost.Configure()
僅在啟動時執行一次,用於配置您的 AppHost。 如果您希望插件在請求期間執行邏輯,則需要注冊一個在ServiceStack Request Pipeline中執行的自定義過濾器。
我們上面面臨的問題是我們的身份驗證插件在 AppHost.OnPreExecuteServiceFilter 之前被調用
此方法在執行服務之前執行,在此方法之后但在服務之前執行的唯一其他過濾器是服務過濾器和操作請求過濾器屬性。
填充 HttpContext.Current 后是否會觸發不同的 AppHost 事件
HttpContext.Current
在執行任何 ServiceStack 請求之前由 ASP.NET 框架填充,這意味着它總是在ServiceStack 請求管道中的任何過濾器之前填充。 它不會被填充的主要原因是如果在運行時的請求期間沒有從 ASP.NET 請求工作線程訪問它。
在調用插件之前?
這是不可能回答的,因為您的問題遺漏了關於您的插件究竟在哪里注冊其自定義處理程序的重要信息? 即在此之前執行的過濾器取決於您的插件正在注冊的請求過濾器。 在我們的操作順序頁面中記錄了請求期間執行不同處理程序的順序。
如果您指的是您的插件Register(IAppHost)
,這就像AppHost.Configure()
僅在啟動時執行一次,您無法在啟動時訪問HttpContext.Current
,它僅在請求期間可用。 Startup 初始化邏輯是您的插件將注冊其請求過濾器的地方,例如appHost.PreRequestFilters
或appHost.GlobalRequestFilters
,它們在執行 ServiceStack 服務之前的請求期間執行。 而*ResponseFilters
在服務執行后執行。
現在HttpContext.Current
用於在請求上下文不可用時從 singleton 上下文訪問 ASP.NET 請求上下文,但這在 ServiceStack 中通常是不必要的,因為每個請求過濾器都可以從 ServiceStack IRequest.OriginalRequest
檢索 ASP.NET 請求上下文,例如:
PreRequestFilters.Add((req, res) =>
{
var aspReq = req.OriginalRequest as HttpRequestBase;
});
例如。 在 Service 中,您可以從base.Request
訪問IRequest
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.