2017-04-10 9 views
2

私はXamarin AppでRefitライブラリを使用していますが、要求に対して10秒のタイムアウトを設定します。これをやり直す方法はありますか?Refitライブラリでタイムアウトを設定するには

インタフェース:

interface IDevice 
{ 
    [Get("/app/device/{id}")] 
    Task<Device> GetDevice(string id, [Header("Authorization")] string authorization); 
} 

API

var device = RestService.For<IDevice>("http://localhost");    
var dev = await device.GetDevice("15e2a691-06df-4741-b26e-87e1eecc6bd7", "Bearer OAUTH_TOKEN"); 

答えて

3

を呼び出すには、私は最終的に修理され、リクエストのタイムアウトを設定する方法を見つけました。私はCancelationTokenを使用しました。

interface IDevice 
{ 
    [Get("/app/device/{id}")] 
    Task<Device> GetDevice(string id, [Header("Authorization")] string authorization, CancellationToken cancellationToken); 
} 

APIを呼び出す:

var device = RestService.For<IDevice>("http://localhost");  
CancellationTokenSource tokenSource = new CancellationTokenSource(); 
tokenSource.CancelAfter(10000); // 10000 ms 
CancellationToken token = tokenSource.Token;   
var dev = await device.GetDevice("15e2a691-06df-4741-b26e-87e1eecc6bd7", "Bearer OAUTH_TOKEN", token); 

それは私のために正常に動作する。ここCancelationToken

インタフェースを追加した後に変更されたコードです。私はそれが正しい方法であるかどうかわからない。それが間違っている場合は、間違いなく正しい方法を提案してください。

3

受け入れ答えは、単一の要求のタイムアウトを強制する正しい方法ですが、すべての要求に対して単一の一貫性のタイムアウト値を持つようにしたい場合は、そのTimeoutプロパティセットを事前に設定HttpClientを渡すことができます。

var api = RestService.For<IDevice>(new HttpClient 
{ 
    BaseAddress = new Uri("http://localhost"), 
    Timeout = TimeSpan.FromSeconds(10) 
}); 

ここにはexample projectがあります。

+0

最新バージョンでは動作しないようです。 –

+0

それは私のために働く。どの部分がうまくいきませんか?このようにタイムアウトを設定することはRefitとは関係ありません。標準的な 'HttpClient'のものです。 –

+0

@MarkFeldmanサンプルプロジェクトへのリンクを回答に追加しました。 –

関連する問題