调试ServiceStack POST请求反序列化

问题描述:

我有一个用例,我发布一个复杂的对象与数组成员使用jQuery。例如:调试ServiceStack POST请求反序列化

data: { 
    obj1: obj1, 
    arr1: [ ... ] 
} 

在服务器上,我实现了ServiceStack服务。服务器上的自动请求映射会为请求成员生成空值,但如果我提取Request.GetRawBody(),然后使用ServiceStack.Text.JsonSerializer.DeserializeFromString,则可以得到我所需的值。

调试实际的反序列化并查看缺少的内容将非常有用。有人知道怎么做吗?

例子:

传递一个平面物体 定义一个简单的请求对象的几个领域:

public class Request 
{ 
    public string Name { get; set; } 
} 

做一个jQuery的AJAX调用:

$.ajax({ 
    //... 
    data: { 
    name: 'John Doe' 
    } 
}); 

该调用起作用,服务器收到带有“John Doe”的对象名称属性。与子对象

通行证对象

public class Request 
{ 
    public Caller Caller { get; set; } 
} 

public class Caller 
{ 
    public string Name { get; set; } 
} 

然后使从jQuery的一个电话:

$.ajax({ 
    // ... 
    data: { 
    caller: { 
     name: 'John Doe' 
    } 
    } 
}); 

呼叫后,对服务请求的“来电显示”属性“空“,所以这种方法是行不通的。

结论 在我原来的评估中,我指的是对象和数组的组合。我想问题是获取一个简单的子对象序列化/反序列化。这是否意味着这个概念不被支持,还是我错误地传递了这个对象?

我想通了这个问题,希望回答帮助他人。事实证明,$。AJAX是发送内容类型编码形式的URL(这是jQuery的文档中明确记载,我刚刚错过了它): http://api.jquery.com/jQuery.ajax/

设置的contentType为“应用/ JSON的”解决了这个问题,现在所有的数据都在服务器上正确反序列化。

如果你真的认为它的实际反序列化有问题,那么我会建议从github下载源代码并尝试创建失败的单元测试。如果你认为它与json反序列化,然后下载ServiceStack.Text项目。否则,你应该下载主要的ServiceStack项目。阅读现有的单元测试对于整个项目的工作过程是非常有益的。

但是,可能是无效的json表示法。通过比较序列化DTO的结果和实际传递给ajax调用的结果来反向设计json通常很有用。

更新时间:您的JSON应该是这样的:

{"Caller":{"Name":"John Doe"}} 

最简单的方法来检查,这是做到以下几点:

var r = new MyRequest() {Caller = new Caller() {Name = "John Doe"}}; 
var json = r.ToJson(); 
+0

感谢您的回复。我其实不认为有什么问题,我很确定我做错了什么。我当然不认为反序列化有什么问题,当我简单地反序列化身体时,它正在工作。我试图找出什么是不同的,当对象被映射到请求对象的服务堆栈,并且当身体被手动反序列化时。希望这是有道理的。如果不是,我可以提供代码示例。 – user975060 2013-04-12 02:51:33

+0

我认为这将有助于你提供特定的代码示例。它将在未来为其他人提供更多帮助。 – kampsj 2013-04-12 13:32:26

+0

我已更新原始条目,对不起,花了一段时间。 – user975060 2013-04-24 02:02:10