私はAPI、C#クライアントとそのAPIラッパーを持っています。私は柔軟な方法でAPIを扱うための拡張メソッドを含むクラスを持っています。HttpResponseMessageの観測可能性の中でAPIエラーをチェックし、どのようにチェックするのですか?
エラーを処理しようとしています。これらの拡張メソッドの一つがある:
はpublic static IObservable<HttpResponseMessage> CheckForApiErrors(this IObservable<HttpResponseMessage> source)
{
return source.SelectMany(message => {
if (message.IsSuccessStatusCode) {
return source;
}
var exTask = ApiException.CreateFromHttpMessage(message);
return Observable.FromAsync(() => exTask).SelectMany(Observable.Throw<HttpResponseMessage>);
});
}
これは正しくスローし、私ができる観測可能に後で。ただし、そのメソッドを通過した(成功した)すべての要求が今再生されます。 私が/some_endpoint
に電話して成功すると、オブザーバブルが再生され、/some_endpoint
が再び呼び出されます。
return source.SelectMany(message => {
if (message.IsSuccessStatusCode) {
return source; // <-----------
}
私は本当に、私はエラーをチェックし、スローするように私のSelectManyのアプローチについて疑うよcorrecltyとエラーをスローする方法を知りませんが、それはです:
私は障害のあるラインはここにあると思います私が見つけた唯一の解決策です。
throw
をDo()
に入れて、通常のストリームに干渉しないようにしたいが、それは観測可能なアプリケーションだけでなく、アプリケーション全体をクラッシュさせる。
編集(会合を持って、それの真ん中にアイデアを持っていた今朝疲れでなければなりません):
代わりのreturn source;
私はreturn Observable.Return(message);
を行うことができます。もちろん、それは動作します。しかし、私はまだ私のアプローチが嫌いですが、私はまだそれを達成するよりエレガントな方法があるように感じています。
"これは私が見つけた唯一の解決策です。" - ソースに2つのサブスクリプションが存在するため解決策ではありません。 Shlomoは正しいアプローチをとった。 – Enigmativity