1

POSTを使用すると、ServiceStackJsonクライアントが結果を逆シリアル化しないという問題が発生します。getメソッドは、応答をUserCredentialsオブジェクトに逆シリアル化することに問題はありませんが、POSTメソッドを使用すると、すべてnullプロパティを持つオブジェクトが返されます。Postメソッドに渡されるタイプをディクショナリに変更すると、正しい結果が得られていることがわかり、残りの呼び出しがFiddlerからのhttpレベルで成功していることがわかります。

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

2 に答える 2

1

ServiceStackサーバー側のコードはどのように見えますか?サーバーで以下のようなことを行うと、次のようなJsonServiceClientを使用できるようになります。

LoginServiceの呼び出し:

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

LoginServiceの実装:

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()};
    }
}
于 2013-03-14T17:41:04.003 に答える
1

パブリックフィールドではなく、UidとHashをパブリックプロパティにする必要があると思います。ただし、これが当てはまる場合、GETリクエストがどのように適切に逆シリアル化されているかはわかりません。

public class UserCredentials
{
    public long Uid {get; set;}
    public string Hash {get; set;}
}
于 2013-03-14T21:47:50.097 に答える