2013-05-06 132 views
1

我正在爲servicestack編寫一個插件,我想利用內置於服務的error handling。這個想法是我想在處理路由之前執行一些邏輯,並且可能返回403錯誤。我認爲這樣做的方式是添加一個RequestFilter並從其中投擲一個UnauthorizedAccessException自定義插件的錯誤處理

雖然這不起作用,並且響應最終是空的。它看起來像通常處理這些的try/catch不適用於RequestFiltersDtoUtils有一個HandleException()方法創建一個錯誤響應,但我不知道如何正確地將其添加到RequestFilter收到的IHttpResponse

我想知道是否有另一種方法來添加預路由邏輯,您可以從內部服務中引發異常,或者是否有建議的方式來創建來自RequestFilter的錯誤響應。通過在服務中拋出的異常返回

編輯

我想通過插件返回匹配錯誤(儘可能地)的錯誤。

DtoUtils.HandleException看起來像SS構建所述響應的方式,但它拋出一個StackOverflowException當我嘗試從插件這樣稱呼它:

var error = new HttpError(HttpStatusCode.Forbidden, "UnauthorizedAccessException", message); 
//_appHost is stored by the original Register() call 
var result = DtoUtils.HandleException(_appHost, request, error); 
response.WriteToResponse(request, result); 
response.EndServiceStackRequest(); 

回答

0

我結束了使用這種方法,但我不知道它的最好的方式。它仍然不檢查自定義的全局錯誤處理程序,這將是理想的。

response.WriteErrorToResponse(request, 
           request.ResponseContentType, 
           request.HttpMethod, 
           message, 
           new UnauthorizedAccessException(message), 
           (int)HttpStatusCode.Forbidden); 
response.EndServiceStackRequest(); 
2

您有望與請求過濾器,我懷疑你只是沒有正確設置響應。

我建議檢查一下所需的角色過濾器是如何工作的,並寫出類似的東西。

https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.ServiceInterface/RequiredRoleAttribute.cs

res.StatusCode = (int)HttpStatusCode.Forbidden; 
res.StatusDescription = "Invalid Role"; 
res.EndServiceStackRequest(); 
+0

我試過這個,但是響應與來自服務的正常異常響應非常不同。從jQuery調用時很容易看到這一點,當你這樣做時'jqXHR.responseText'是空的。對於正常的ServiceStack異常,responseText包含序列化錯誤。 – Tyrsius 2013-05-06 17:49:51