最近我遇到了類似的問題,並解決它,如下所示:
自定義驗證過濾
有2個可能與這一個基於日誌,你會喜歡的類型。如果你在這裏拋出一個異常,您可以通過在APPHOST設立ServiceExceptionHandler
抓住它:
this.ServiceExceptionHandler = (httpRequest, request, exception) =>
{
LogData(httpRequest, exception);
return DtoUtils.HandleException(this, request, exception);
};
如果這種做法不會爲你工作,或者你不扔AUTH期間例外,你將有在auth過濾器運行之前或之後創建一個日誌過濾器。這可以在幾個不同的位置使用PreRequestFilter
或RequestFilter
完成,具體取決於您何時需要它運行(請參閱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
,如上所述。