我使用的是RequestFilter處理前的一些消息到Web服務,如果有錯誤,我想在請求返回ResponseDTO,然後殺死進一步處理。我如何實現這一功能?ServiceStack - 如何從RequestFilter返回ResponseDTO?
此外,我使用的RequestDTO類[RequestFilter]裝飾實現這個。如果我想要有多個請求過濾器,如何選擇要用於給定RequestDTO的過濾器?
我使用的是RequestFilter處理前的一些消息到Web服務,如果有錯誤,我想在請求返回ResponseDTO,然後殺死進一步處理。我如何實現這一功能?ServiceStack - 如何從RequestFilter返回ResponseDTO?
此外,我使用的RequestDTO類[RequestFilter]裝飾實現這個。如果我想要有多個請求過濾器,如何選擇要用於給定RequestDTO的過濾器?
如果有錯誤,我想在請求返回ResponseDTO,然後殺死進一步處理。我如何實現這一功能?不完全確定你將如何確定錯誤,所以這是一個非常基本的解決方案。
public class RequestFilterAttribute : Attribute, IHasRequestFilter
{
public void RequestFilter(IHttpRequest req, IHttpResponse res, object requestDto)
{
if(requestDto.GetType() == typeof(YourRequestType))
{
//code to check for errors - if error throw exception
throw new Exception("Exception for your request type");
}
}
}
如果我想有多個請求的過濾器,我該怎麼選擇過濾器被用於給定RequestDTO?
您可以創建多個不同的RequestFilter實現和裝飾每個DTO的與不同的實現。
public class FilterOneAttribute : Attribute, IHasRequestFilter
{
//Code
}
public class FilterTwoAttribute : Attribute, IHasRequestFilter
{
//Code
}
[FilterOne]
public class OneClass
{
//Code
}
[FilterTwo]
public class TwoClass
{
//Code
}
上面的答案告訴我們如何選擇過濾器和如何失敗,但不知道如何返回一個成功的替代響應。 How to find Service from ServiceStack RequestFilter顯示如何創建適當的ResponseDTO。關鍵在於你將ResponseDTO序列化爲響應流,然後關閉流。我猜ServiceStack使用這個作爲提示不運行服務或任何其他過濾器。
右,關閉響應流告訴ServiceStack該請求已被處理,並且它應停止請求的進一步處理。推薦的方法以關閉響應流是使用'httpRes.EndServiceStackRequest()'擴展方法,這也將寫出任何全局標題(如果指定的話)。 – mythz 2013-03-10 16:50:51
請注意,您可以裝飾相應的服務而不是DTO,以避免與消費者共享請求過濾器實現。 – Todd 2013-03-10 15:52:32