2013-07-08 85 views
5

什麼是設置最簡單的方法在ServiceStack請求/響應攔截器,將執行特定服務?全球請求/響應攔截

請求過濾器(IHasRequestFilter)工作正常,但如果服務返回非2xx狀態代碼,則不會觸發響應過濾器(IHasResponseFilter)。我需要檢索方法返回的狀態碼以及響應DTO(如果有的話)。

定製ServiceRunner並重寫OnBeforeExecuteOnAfterExecute方法似乎很好地工作,但我覺得它很麻煩,因爲服務轉輪需要更換整個應用程序,我能不能找到一種方法清潔的方式每個功能的隔離需要在這些方法中執行的任務。

是否有ServiceStack一些擴展點,我很想念,讓我給每個服務方法之前和每個服務方法後執行一些代碼?一個插件將是理想的,但我怎麼可以訂閱一些虛構BeforeExecuteAfterExecute方法,讓我來運行一些自定義代碼?


UPDATE:

剛剛發佈,我發現,全球應對過濾器無論在什麼狀態代碼是由這正是我需要的服務返回執行的問題後。最後一個問題是:是否可以檢索將在請求過濾器中處理請求的服務類型?我需要檢查這個服務是否由一些自定義標記屬性裝飾。

回答

3

我已經找到了一個解決方案,我如何在一個自定義的請求/響應濾波器檢索服務類型的問題:

appHost.RequestFilters.Add((req, res, requestDto) => 
{ 
    var metadata = EndpointHost.Metadata; 
    Type serviceType = metadata.GetServiceTypeByRequest(requestDto.GetType()); 

    ... 
} 
+0

是啊,我只是在中間的回答指向您將元數據:)另外您還可以查看元數據ServiceStack已與[/operations/metadata](http://razor.servicestack.net/operations/metadata)航線問答。 – mythz

2

IHttpRequest有OperationName。我想那是你以後的。

+0

不,這不是我所追求的。我需要服務類型('System.Type'),以便可以讀取此服務可能已裝飾的任何可能的自定義屬性。我已經找到了解決方案,並將其作爲答案發布。 –

3

定製ServiceRunner並重寫OnBeforeExecute和OnAfterExecute方法似乎工作不錯,但我覺得很麻煩,因爲服務轉輪需要更換整個應用程序

快速筆記,你可以選擇加入,只選擇什麼樣的要求應該使用的定製服務運動員,如:

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(
    ActionContext actionContext) 
{   
    return useCustomRunner(actionContext.RequestType) 
     ? new MyServiceRunner<TRequest>(this, actionContext) 
     : base.CreateServiceRunner<TRequest>(actionContext); 
}