ServiceStack返回JSV而不是JSON

时间:2013-08-12 21:37:42

标签: servicestack servicestack-text

我有一个使用ServiceStack创建的服务。最近我更新了ServiceStack库,现在我得到JSV响应而不是JSON响应。

请求类似于:

POST http://localhost/api/rest/poll/create?format=json&PollFormat=1 HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 160
Accept: */*
Origin: http://localhost
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
DNT: 1
Referer: http://localhost
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: 

Question=this+is+a+test&Answers=yes%2Cno&

响应看起来像:

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
X-Powered-By: ServiceStack/3.956 Win32NT/.NET
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 12 Aug 2013 21:20:33 GMT
Content-Length: 437

{Id:1,Question:this is a test,Answers:[{Id:1,Text:yes,Votes:0},{Id:2,Text:no,Votes:0}],IsOpen:1,TotalVotes:0}}

请注意,我已经在响应中略微调整了JSV以使其更容易阅读,因此,示例中的Content-Length将是不正确的。

据我所知,ServiceStack的默认ContentType应为JSON

那么为什么我要用一个ContentType of application / json来获取JSV?

编辑:

这是我的请求dto的样子:

[Route("/poll/create", Verbs = "POST")]
public class PollRequest : IReturn<Object>
{
    public string Question { get; set; }
    public string Answers { get; set; }
    public int? PollFormat { get; set; }
}

以下是我的服务:

public class PollService : Service
{
    public object Post(PollRequest request)
    {
        //
        // do work required to create new poll
        //
        Poll p = new Poll();
        if(request.PollFormat.HasValue)
        {
            return JsonSerializer.DeserializeFromString<object>(p.JSON);
        }
        else
        {
            return PostConvertor.ConvertTo(p);
        }
    }
}

以下是我的民意调查回复:

public class Poll
{
    public int Id { get; set; }
    public string Question { get; set; }
    public Collection<Answer> Answers { get; set; }
    public int IsOpen { get; set; }
    public int TotalVotes { get; set; }

    public class Answer
    {
        public int Id { get; set; }
        public string Text { get; set; }
        public int Votes { get; set; }
    }
}

1 个答案:

答案 0 :(得分:1)

原来我们有一个参数被发送到服务,定义了如何返回响应。如果设置了参数,我们将手动生成一个JSON字符串(由我的编辑问题中的p.JSON属性表示),然后从该字符串返回一个反序列化的对象,如下所示:

return JsonSerializer.DeserializeFromString<object>(p.JSON)

在以前版本的ServiceStack中,似乎反序列化的对象将产生一个字符串,其内容与输入JSON相同(不知道为什么我们这样做,因为它似乎浪费了CPU)。较新版本的ServiceStack似乎也将JSON反序列化为字符串,但该字符串使用JSV格式。

我认为我们这样做的原因(尽管我不确定)是我们试图从JSON中获取一个通用对象,这样当我们返回它时,它可以转换为JSON或XML,具体取决于请求者想要。但是当前的实现总是返回一个JSON格式的字符串,所以如果我只是替换

return JsonSerializer.DeserializeFromString<object>(p.JSON)

return p.JSON

然后我想我会保持响应不变。