2014-02-26 65 views
0

我有一個RequestLog功能與應用程序邏輯完全分離。ServiceStack - OnEndRequest捕獲響應主體

我在預先請求過濾器中捕獲請求/響應。爲了實現這一點,我實例化了一個保持請求上下文的請求範圍對象。在所有事情都被處理之前(在AppHost的OnEndRequest處理程序中),我寫入數據庫。每個http請求一行。

我能夠訪問響應碼,路徑,該方法中,要求體,請求報頭等

然而,由於它已經被設置在響應流是不可用的。這背後的邏輯是什麼?是這樣的嗎,IIS將流內容寫入導線,並立即釋放資源?有什麼方法可以捕獲OnEndRequest處理程序中的Response主體?

感謝

回答

1

不,ServiceStack不緩衝響應流中它被直接寫入到ASP.NET響應。

您可以添加全局響應過濾器或Custom ServiceRunner以捕獲服務響應(如果request reaches that far),但可以通過關閉響應在整個請求管道中隨時將請求短路。

+0

是的,我知道。實際上,這就是我在預先請求過濾器中抓取所有內容的原因,並將它們轉儲到數據庫的「OnEndRequest」。我想要一個發佈請求過濾器的錯覺。這個想法是有一個請求記錄器,其中包含所有進入sshttphandlerfactory的請求。由於「短循環」,標準RequestLogsFeature無法實現這種行爲。這種情況是否有任何特殊原因沒有考慮? –

+0

沉思?短路是一項功能,響應總是按預期直接寫入響應流。查看請求管道中的第一個條目以獲得每個請求的通知,即註冊一個RawHttpHandler,您希望返回null以便不劫持請求。 – mythz

+0

我只是試圖讓你看到這種記錄器/功能的重要性。也許你有理由認爲它不相關,因爲它在ServiceStack中沒有強烈的預期(RequestLogFeature是一個servicerunner的東西)。但我想答案是使用HttpRawHandler。我假設我仍然不能訪問原始輸出主體,這正是我的意圖。這樣,它將與寫入響應的任何其他功能分離並關閉請求。 –