2012-10-18 21 views
1

所以我修改了todo服務,它給了我一個響應。ServiceStack返回XML格式的輸入響應

當我故意拋出一個未處理的錯誤來測試ServiceExceptionHandler代碼如果我使用默認的/Backbone.Todos/todo/1?format=json,那很好。

但是,如果使用/Backbone.Todos/todo/1?format=xml,它說:

XML Parsing Error: not well-formed Location: /Backbone.Todos/todo/1 Line Number 1, Column 2:

這裏是我的代碼:

public class AppHost : AppHostBase { 
    public override void Configure(Funq.Container container) { 
     //Unhandled errors 
     this.ServiceExceptionHandler = (req, ex) => { 
      var res = new { //i return a dynamic object here ... and it doesn't work 
       Result = null as object, 
       ResponseStatus = new ResponseStatus() { 
       ErrorCode = "Error", 
       Message = "Not available", 
       StackTrace = "Not available" 
       } 
      }; 
      return res; 
     }; 
    //... 
    } 
//.... 
} 

//My normal request/response dtos look like this: 
//----------------------------------------- 
[Route("/todo/{id}", "GET")] //display req 
public class GetTodo : IReturn<TodoResponse> { 
    public long Id { get; set; } 
} 
public class TodoResponse : IHasResponseStatus { 
    public IList<Todo> Result { get; set; } 
    public ResponseStatus ResponseStatus { get; set; } 
} 

的事情是,當錯誤發生我不能構建一個正確的響應類型不知道它是什麼類型。我只接收請求和異常作爲參數,但不是響應類型。

+0

也就是說,我想在這裏構造一個正確類型的響應對象。 – Tom

回答

3

我懷疑這個錯誤是因爲XML不能自動序列化.net中的動態對象。

我不完全相信我知道你在做什麼,但你可以嘗試使用內置的實用程序來處理異常,然後根據需要修改它。

this.ServiceExceptionHandler = (req, ex) => 
{ 
    var responseStatus = ex.ToResponseStatus(); 
    var errorResponse = ServiceStack.ServiceHost.DtoUtils.CreateErrorResponse(req, ex, responseStatus); 
    return errorResponse; 
}; 
+0

謝謝kampsj。這是很大的幫助。我永遠無法自己弄清楚這一點。我希望這種事情在某個地方被記錄下來。 – Tom