ServiceStack以XML格式返回类型化响应

时间:2012-10-18 08:47:16

标签: c# .net servicestack

所以我修改了todo服务,给了我一个回复。

当我故意抛出未处理的错误来测试下面的ServiceExceptionHandler 代码时,如果我使用默认的/Backbone.Todos/todo/1?format=json,那就没关系。

但如果我使用/Backbone.Todos/todo/1?format=xml,则说:

  

XML解析错误:格式不正确的位置:    /Backbone.Todos/todo/1第1行,第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; }
}

问题是,当发生错误时我无法在不知道它是什么类型的情况下构建正确类型的响应。我只接收传入的Request和Exception作为参数,但不是响应类型。

1 个答案:

答案 0 :(得分:3)

我怀疑错误是因为XML无法自动序列化.net中的动态对象。

我不完全确定我知道你要做什么,但你可以尝试使用内置的实用程序来处理异常,然后根据需要修改它。

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