4

ServiceStack で作成されたサービスがあります。最近、ServiceStack ライブラリを更新したところ、JSON 応答ではなく JSV 応答を取得するようになりました。

リクエストは次のようになります。

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である必要があります

では、なぜ application/json の ContentType で 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);
        }
    }
}

私の Poll レスポンスは次のようになります。

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; }
    }
}
4

1 に答える 1

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

それから、私はそれと同じように応答を維持すると思います。

于 2013-08-13T18:23:29.887 に答える