2013-03-10 58 views
1

找到服務根據Service中將被調用的信息,我試圖實現有條件執行的RequestFilter。我想讓RequestFilter找到Service,查看它的方法/接口/屬性,並有條件地根據它做它的工作。如何從ServiceStack RequestFilter

我知道你可以在Service上聲明RequestFilterAttribute,但是我找不出一個有條件的好方法。我想將一個委託/ lambda傳入屬性,但C#不允許這樣做。我可以插入類型或類型名稱,允許RequestFilterAttribute找到Service類/方法,但似乎很容易複製/粘貼錯誤。

所以我留下了希望某種方式爲RequestFilterRequestFilterAttribute瞭解的Service它作用於(或宣佈),然後想查找該Service將提供使所需的邏輯裏面的方法/禁用過濾器的代碼。我無法分辨IoC容器的某些功能是否提供了此功能,或者是否有其他方式來執行此功能。

然後,根據過濾器的執行方式,可能需要返回自己的數據,阻止服務實際執行。這可能嗎? (是this的答案是什麼?)

回答

3

這似乎是關鍵:

var serviceType = EndpointHost.Metadata.GetServiceTypeByRequest(requestDto.GetType()); 

這將返回處理請求的服務類型。它不是一個實例(但我懷疑服務實例甚至已經創建),所以要做條件邏輯,我必須定義一個靜態方法,然後查找它。我使用反射來查找聲明特殊屬性的方法,並且需要優化以獲得最佳性能。

從那裏我可以有條件地確定是否運行一些邏輯。我也可以跳過調用服務,如果我喜歡,並返回一個成功響應如下:

var successResponse = DtoUtils.CreateSuccessResponse(successMessage); 
var responseDto = DtoUtils.CreateResponseDto(requestDto, successResponse); 
var contentType = req.ResponseContentType; 
res.ContentType = contentType; 
res.WriteToResponse(req, responseDto); 
// this is the proper way to close the request; you can use Close() but it won't write out global headers 
res.EndServiceStackRequest(); 
return; 

或者,我可以創造一個錯誤響應,或者從RequestFilter剛剛返回,並讓服務正常執行。

相關問題