要求內容
RequestContext 是一項 Orleans 功能,可讓應用程式中繼資料 (例如追蹤識別碼) 透過要求傳送。 應用程式中繼資料可新增到用戶端上;它會透過 Orleans 要求傳送至接收端粒紋。 此功能是由 Orleans 命名空間中的公用靜態類別 RequestContext
所實作。 此類別會公開兩個簡單的方法:
void Set(string key, object value)
上述 API 可用來將值儲存在要求內容中。 此值可以是任何可序列化型別。
Object Get(string key)
上述 API 可用來從目前的要求內容中擷取值。
RequestContext
的支援儲存體為非同步本機。 當呼叫端 (無論是用戶端還是 Orleans 內部) 傳送要求時,呼叫端 RequestContext
的內容都會連同 Orleans 訊息包含在要求中;當粒紋程式碼收到要求時,可從本機 RequestContext
存取該中繼資料。 如果粒紋程式碼未修改 RequestContext
,則受到其要求的任何粒紋都會接收到相同的中繼資料,依此類推。
當您使用 StartNew 或 ContinueWith 排程未來的計算時也會保有應用程式中繼資料;在這兩種情況下,接續都會使用與排程程式碼在排程接續時具備的相同中繼資料來執行 (也就是說,系統會建立目前中繼資料的複本,並將其傳至接續,因此接續將不會看到在呼叫 StartNew
或 ContinueWith
之後產生的變更)。
重要
應用程式中繼資料不會透過回應傳回;也就是說,因收到回應而執行的程式碼 (在 ContinueWith
接續內或呼叫 Task.Wait() 或 GetValue
之後),仍會在原始要求所設定的目前內容中執行。
例如,若要將用戶端中的追蹤識別碼設定為新的 Guid
,只需要呼叫:
RequestContext.Set("TraceId", Guid.NewGuid());
在粒紋程式碼 (或在排程器執行緒上的 Orleans 內執行的其他程式碼) 內,可以使用原始用戶端要求的追蹤識別碼 (例如,在撰寫記錄時):
Logger.Info("Currently processing external request {0}", RequestContext.Get("TraceId"));
雖然任何可序列化物件都可以當作應用程式中繼資料來傳送,但值得留意的是,大型或複雜物件可能會顯著增加訊息序列化期間的額外負荷。 因此,建議使用簡單型別 (字串、GUID 或數值型別)。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應