Ваш метод создает горячую наблюдаемую, что означает, что он уже начал загружаться, когда он возвращается, и каждая новая подписка не создает новый запрос к веб-серверу. Вам нужно обернуть ваш метод в другой и использовать Observable.Create (для создания холодной наблюдаемой, которая создает новый запрос при каждой подписке):
public static IObservable<WebClientResponse> DownloadStringAsync(this WebClient webClient, Uri address, WebHeaderCollection requestHeaders)
{
return Observable
.Create(observer =>
{
DownloadStringAsyncImpl(webClient, address, requestHeaders)
.Subscribe(observer);
return () => { webClient.CancelAsync(); };
});
}
Здесь DownloadStringAsyncImpl - ваша предыдущая реализация DownloadStringAsync, в то время как публичный метод был заменен.
Теперь вы можете повторить асинхронный метод, пока он не выполнится следующим образом:
myWebClient
.DownloadStringAsync( /* args... */)
.Retry()
.Subscribe(result => {
/* now I've got a result! */
});