Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ServiceStack以XML格式返回类型化响应_C#_.net_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,.net,servicestack" /> servicestack,C#,.net,servicestack" />

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

C# ServiceStack以XML格式返回类型化响应,c#,.net,servicestack,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 : AppHost

所以我修改了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; }
}
公共类AppHost:AppHostBase{
公共覆盖无效配置(Funq.Container){
//未处理的错误
this.ServiceExceptionHandler=(请求,例外)=>{
var res=new{//我在这里返回一个动态对象……但它不起作用
Result=null作为对象,
ResponseStatus=新ResponseStatus(){
ErrorCode=“Error”,
Message=“不可用”,
StackTrace=“不可用”
}
};
返回res;
};
//...
}
//....
}
//我的普通请求/响应DTO如下所示:
//-----------------------------------------
[Route(“/todo/{id}”,“GET”)]//显示请求
公共类GetTodo:IReturn{
公共长Id{get;set;}
}
要响应的公共类:IHasResponseStatus{
公共IList结果{get;set;}
公共响应status ResponseStatus{get;set;}
}

问题是,当发生错误时,我无法在不知道响应类型的情况下构建正确的响应类型。我只将传入的请求和异常作为参数获取,而不是响应类型。

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

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

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

谢谢kampsj。这是很大的帮助。我一个人永远也弄不明白。我希望这类事情能被记录在某个地方,也就是说,我试图在这里构造一个正确类型的响应对象。