2013-03-14 40 views
1

我們目前正在使用ServiceStack作爲我們的服務配置核心框架。 有誰知道是否可以將自定義例外封裝到自定義ErrorResponse對象中?ServiceStack自定義ErrorResponse DTO

從SS維基:

「除了上述選項,你可以通過實現IResponseStatusConvertible.ToResponseStatus()方法來覆蓋特設異常的系列化,使其返回自己的人口ResponseStatus實例代替。」

這似乎符合我的需求,但我無法弄清楚我可以重寫此序列化的位置。

同樣,我試圖通過在AppHost中註冊它們來使用自定義httphandler,但在發生異常時不會調用它們。

我當然錯過了什麼,有沒有人可以指導我通過這個?

回答

1

這是ServiceStack的Error Handling wiki page

這是什麼意思,如果您的自定義例外實施IResponseStatusConvertible,您可以控制如何序列化ResponseStatus。這裏是ValidationException實現它的源代碼,例如:

public class ValidationException : ArgumentException, IResponseStatusConvertible 
{ 
    public IEnumerable<ValidationFailure> Errors { get; private set; } 

    public ValidationException(IEnumerable<ValidationFailure> errors) : base(BuildErrorMesage(errors)) { 
     Errors = errors; 
    } 

    private static string BuildErrorMesage(IEnumerable<ValidationFailure> errors) { 
     var arr = errors.Select(x => "\r\n -- " + x.ErrorMessage).ToArray(); 
     return "Validation failed: " + string.Join("", arr); 
    } 

    public ResponseStatus ToResponseStatus() 
    { 
     var errors = Errors.ConvertAll(x => 
      new ValidationErrorField(x.ErrorCode, x.PropertyName, x.ErrorMessage)); 

     var responseStatus = ResponseStatusUtils.CreateResponseStatus(typeof(ValidationException).Name, Message, errors); 
     return responseStatus; 
    } 
} 

但這只是控制ResponseStatus是如何序列化,而不是如何創建通用的響應。查看IAppHost.ServiceExceptionHandler的描述,或者如果要更改返回的錯誤響應,請使用自定義服務運行器。

+0

嗨德米斯,我們正在使用IAppHost.ExceptionHandler而不是IAppHost.ServiceExceptionHandler這是沒有觸發。我們遇到的問題是我們的錯誤響應被附加到ServiceStack產生的缺省響應。我們也會看看Service Runner。非常感謝 – 2013-03-14 17:11:22

+0

@MarcoSerina只會爲服務中的異常解僱IAppHost.ServiceExecptionHandler。對於外部發生的異常(例如過濾器,請求綁定等),您可以使用'IAppHost.ExceptionHandler'。 – mythz 2013-03-14 17:39:30

相關問題