2

ServiceStack を使用して Web サービス API のプロトタイプを作成していますが、GetAsync のテスト中に問題が発生しました。具体的には、onSuccess アクションが呼び出されるはずのときに呼び出されません。

これが私のコードです:

サーバ:

[Route("/accounts/", "GET")
public class AccountRequest : IReturn<AccountResponse>
{
    public string EmailAddress {get; set;}
}

public class AccountResponse
{
    public Account Account {get; set;}
}

public class AccountService : Service
{
    public object Get(AccountRequest request)
    {
        return new AccountResponse{Account = new Account.....
    }
}

非常に基本的で、ServiceStack.netの hello world の例とほぼ同じです。

そして、問題のある Client GetAsync 呼び出し:

using(var client = new JsonServiceClient("some url")
{
    client.GetAsync(new AccountRequest{EmailAddress = "gibbons"},
            response => Console.WriteLine(response.Account.Something), //This never happens
            (response, ex) => {throw ex;}); // if it matters, neither does this

}

ただし、これは期待どおりに機能します...

using(var client = new JsonServiceClient("some url")
{
    var acc = client.Get(new AccountRequest{EmailAddress = "gibbons"});

    //acc is exactly as expected.
}

興味深いことに、非同期と非非同期を交互にテストしても機能します。

using(var client = new JsonServiceClient("some url")
{
     client.GetAsync(new AccountRequest{EmailAddress = "gibbons"},
                    response => Console.WriteLine(response.Account.Something), //Works
                    (response, ex) => {throw ex;});

    var acc = client.Get(new AccountRequest{EmailAddress = "gibbons"});

    //Again, acc is exactly as expected.
}

いずれの場合も、実際のデータが Fiddler を介して HTTP 経由で転送されていることがわかります。そのため、非同期 API がどのように機能するかについての基本的な理解が欠けていると思います。

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

1

非同期 API は非ブロックであるため、実行はすぐに続行されます。コールバックは、応答が返されて処理されたときにのみ発生します。

AsyncRestClientTests.csテストではThread.Sleep(1000)、応答が時間内に返されたことをアサートする前に、1 秒間スリープします。

コールバックが発生したかどうかを判断するためにどのくらい待機していますか?

于 2012-12-28T02:45:30.457 に答える