2013-03-14 91 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