2013-08-12 3 views
4

ServiceStack으로 만든 서비스가 있습니다. 최근에 ServiceStack 라이브러리를 업데이트했으며 JSON 응답 대신 JSV 응답을 받고 있습니다.JSON 대신 JSV를 반환하는 ServiceStack

요청은 같은 같습니다

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& 

을 그리고 응답은 같은 같습니다 조금을 더 쉽게하기 위해 나는 응답 JSV을 손질 한

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

주 읽기 때문에 Content-Length는 예제에 맞지 않습니다.

내가 이해에서

, ServiceStack의 기본 ContentType이 내가 응용 프로그램/JSON의 ContentType이와 함께 다시 JSV을 얻고 왜 JSON

해야 하는가?

편집 :

여기
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); 
     } 
    } 
} 

내 설문 조사 응답이 모습입니다 :

여기
[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; } 
} 

내 서비스가 모습입니다 :

여기

이처럼 내 요청 DTO는 모습입니다 :

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; } 
    } 
} 
+0

사용중인 ServiceStack 버전은 무엇입니까? 어떤 버전으로 업그레이드 했습니까? –

+0

우리는 2.0.9를 사용했고 3.9.56.0 (NuGet의 최신 최신 버전)으로 업그레이드했습니다. – niltz

+0

또한 JQuery 호출을 변경하여 "json"이라는 데이터 유형을 제공하여 다음 요청 헤더를 강제 적용하려고 시도했습니다. 'Accept : application/json, text/javascript, */*; q = 0.01 ''을 보낼 수는 있지만 도움이되지 않습니다. – niltz

답변

1

응답이 리턴 된 방법을 정의한 서비스에 매개 변수를 전송했음을 알 수 있습니다. 매개 변수는 우리가 수동으로 JSON 문자열을 생성 할 설정 한 경우 (내 editied 문제의 p.JSON 속성으로 표시), 다음과 같이 해당 문자열에서 역 직렬화 객체를 반환 : ServiceStack 이전 버전의

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

deserialize 된 객체는 내용이 입력 JSON과 동일한 문자열을 생성합니다 (CPU 낭비와 같은 이유 때문에이 작업을 수행하는 이유는 확실하지 않음). 최신 버전의 ServiceStack은 JSON을 문자열로 역 직렬화하는 것처럼 보이지만 문자열은 JSV 형식을 사용합니다.

우리가이 작업을 수행하는 이유는 (확실하지 않지만) JSON에서 일반적인 객체를 얻으 려하므로 JSON 또는 XML로 변환 할 수 있다는 것입니다. 요청자가 원했어. 난 그냥

return p.JSON 

그런 다음 나는 그것이 동일하게 응답을 유지 할 생각으로

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

교체 그래서 만약 그러나 현재 구현은 항상하는 JSON 형식의 문자열을 반환합니다.

관련 문제