2013-03-14 69 views
1

我在使用POST時未對ServiceStack Json客戶端反序列化我的結果時遇到問題。 get方法在將響應反序列化爲UserCredentials對象時沒有問題,但是當我使用POST方法時,它會返回一個具有所有null屬性的對象。如果我將傳遞給Post方法的類型更改爲字典,我可以看到它獲得了正確的結果,並且我可以看到其他調用在來自Fiddler的http級別成功。ServiceStack json客戶端發佈方法未正確反序列化

public UserCredentials Login(string uname, string pwd) 
    { 
     var url = "/login"; 
     //note that I have to send a dictionary because if I sent a Login Object with username and password it erronously sends {Login:} in the raw request body instead of {"Uname":uname, "Password":password} 

     var login = new Dictionary<string, string>() { { "Uname", uname }, { "Password", pwd } }; 
     var result = client.Post<UserCredentials>(url, login); 

     return result; 

    } 

這裏的響應(這是從服務器的正確和預期的HTTP響應)

HTTP/1.1 200 OK 
Server: nginx 
Date: Thu, 14 Mar 2013 12:55:33 GMT 
Content-Type: application/json; charset=utf-8 
Connection: keep-alive 
Vary: Accept-Encoding 
Cache-Control: no-cache 
Pragma: no-cache 
Expires: -1 
Content-Length: 49 

{"Uid":1,"Hash":"SomeHash"} 

這裏是UserCredentials類

public class UserCredentials 
    { 
    public long Uid; 
    public string Hash; 
    } 
+2

爲什麼使用字典而不是UserCredentials實例? – kampsj 2013-03-14 14:28:05

+0

我試着發送用戶憑證,但是通過發送{Login:}而不是{Uname:「foo」,Password:「bar」}發生了錯誤。我寧願發送UserCredentials,但我無法讓它工作。有沒有建議的方式來做到這一點? – MonkeyBonkey 2013-03-14 17:56:34

+0

我想你將不得不發佈整個代碼,如果這些答案都沒有解決它。 – kampsj 2013-03-14 22:47:59

回答

1

我想你只需要做出UID和散列公共屬性而不是公共字段。儘管如此,我不確定您的GET請求是否正確反序列化。

public class UserCredentials 
{ 
    public long Uid {get; set;} 
    public string Hash {get; set;} 
} 
+0

是的,需要是公共領域或它需要設置:'JsConfig.IncludePublicFields = true;'在應用程序啓動。 – mythz 2013-03-14 22:00:07

+0

工作。謝謝! – MonkeyBonkey 2013-03-15 12:01:36

1

什麼是你ServiceStack服務器端代碼看起來像?做類似下面的服務器上應允許您使用JsonServiceClient這樣的:

電話login服務:

var client = new JsonServiceClient("http://url.com/login"); 
var response = client.Post<LoginResponse>(new Login() {Uname = "username", Password = "secret"}); 
var credentials = response.Credentials; 

login服務實現:

public class Login : IReturn<LoginResponse> 
{ 
    public string Uname { get; set; } 
    public string Pasword { get; set; } 
} 

public class UserCredentials 
{ 
    public long Uid {get; set;} 
    public string Hash {get; set;} 
} 

public class LoginResponse : IHasResponseStatus 
{ 
    public LoginResponse() 
    { 
     this.ResponseStatus = new ResponseStatus(); 
    } 

    public UserCredentials UserCredentials { get; set; } 
    public ResponseStatus ResponseStatus { get; set; } 
} 

public class LoginService : Service 
{ 
    public LoginResponse Post(Login request) 
    { 
     //Code to Get UserCredentials 
     return new LoginResponse {UserCredentials = new UserCredentials()}; 
    } 
} 
+0

服務器端代碼返回一個UserCredentials對象,如原始http響應輸出中所示,我使用的是WebApi而不是服務器端的servicestack。 – MonkeyBonkey 2013-03-14 17:55:21

+0

哦,你可能想用WebApi來標記這個問題。您的WebApi控制器的Post方法綁定模型/參數是否正確?這聽起來像JsonServiceClient請求的'線格式'不是WebApi所期望的(除非你使用字典)。我不確定WebApi模型綁定器是如何工作的。 – paaschpa 2013-03-14 18:06:43

+0

Web api響應正常,工作正常。無論服務器如何,這似乎都具有相同的行爲。我看到的錯誤是客戶端反序列化響應,而不是在服務器發送正確的輸出 – MonkeyBonkey 2013-03-14 18:53:13