2014-02-19 60 views
1

這不是關於RequestLogsService或RequestLogFeature的問題。它是關於ServiceRunner對IRequestLogger的調用(如果在應用程序容器中註冊的話)。ServiceStack - 模擬更強大的IRequestLogger範圍

我的應用程序定期進行日誌記錄,轉儲應用程序的流以記錄文件。

我現在正在實施一個數據庫日誌,受到RequestLogsService的啓發。該日誌將包含每個請求一行,包含所有請求和響應數據。

但是我的端點在4個不同電平產生輸出:

  • 定製AUTH濾波器
  • 驗證
  • 服務
  • AppHostExceptionHandler

從這些4中,僅在服務輸出由IRequestLogger覆蓋,因爲它的ServiceRunner相關。有什麼方法可以透明地覆蓋我的4個場景嗎?我想盡量減少流水線中引入的複雜性。

感謝

回答

2

最近我遇到了類似的問題,並解決它,如下所示:

自定義驗證過濾

有2個可能與這一個基於日誌,你會喜歡的類型。如果你在這裏拋出一個異常,您可以通過在APPHOST設立ServiceExceptionHandler抓住它:

this.ServiceExceptionHandler = (httpRequest, request, exception) => 
{ 
    LogData(httpRequest, exception); 
    return DtoUtils.HandleException(this, request, exception); 
}; 

如果這種做法不會爲你工作,或者你不扔AUTH期間例外,你將有在auth過濾器運行之前或之後創建一個日誌過濾器。這可以在幾個不同的位置使用PreRequestFilterRequestFilter完成,具體取決於您何時需要它運行(請參閱ServiceStack的Order of Operations)。

驗證

我假設你正在使用ServiceStack內置的FluentValidation執行您的驗證。在這種情況下,您可以像這樣掛接到插件的ErrorResponseFilter。請注意,如果您需要在此方法中IHttpRequest和IHTTPresponse對象,你可能必須從某個地方做一個黑客-Y的解決方法,並藏匿他們,因爲他們不提供:

Plugins.Add(new ValidationFeature { ErrorResponseFilter = ValidationErrorResponseFilter}); 
... 
private object ValidationError(ValidationResult validationResult, object o) 
{ 
    var httpError = o as HttpError; 
    LogData(httpError); 
} 

AppHostExceptionHandler

如果在安裝AppHost時發生異常,您可能需要用簡單的try/catch來解決。如果APPHOST請求處理期間發生但異常,則可以使用ExceptionHandler類似ServiceExceptionHandler以上:

this.ExceptionHandler = (httpReq, httpRes, operationName, ex) => 
{ 
    LogData(httpReq, httpRes); 
} 

總之,如果這一切不工作或者是太多的代碼太很多地方,你可以改用ServiceRunner中的一種或多種方法來獲得你所需要的。在我的例子中,我忽略了OnAfterExecute來記錄每個請求到服務處理程序,然後只需要將異常處理程序添加到FluentValidation,如上所述。