2013-02-28 29 views
1

我使用的是RequestFilter處理前的一些消息到Web服務,如果有錯誤,我想在請求返回ResponseDTO,然後殺死進一步處理。我如何實現這一功能?ServiceStack - 如何從RequestFilter返回ResponseDTO?

此外,我使用的RequestDTO類[RequestFilter]裝飾實現這個。如果我想要有多個請求過濾器,如何選擇要用於給定RequestDTO的過濾器?

回答

2

如果有錯誤,我想在請求返回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 
} 
+0

請注意,您可以裝飾相應的服務而不是DTO,以避免與消費者共享請求過濾器實現。 – Todd 2013-03-10 15:52:32

1

上面的答案告訴我們如何選擇過濾器和如何失敗,但不知道如何返回一個成功的替代響應。 How to find Service from ServiceStack RequestFilter顯示如何創建適當的ResponseDTO。關鍵在於你將ResponseDTO序列化爲響應流,然後關閉流。我猜ServiceStack使用這個作爲提示不運行服務或任何其他過濾器。

+0

右,關閉響應流告訴ServiceStack該請求已被處理,並且它應停止請求的進一步處理。推薦的方法以關閉響應流是使用'httpRes.EndServiceStackRequest()'擴展方法,這也將寫出任何全局標題(如果指定的話)。 – mythz 2013-03-10 16:50:51