/// <inheritdoc /> public override async Task InvokeAsync(ILoadingContext <TSource> context, LoadingPipeDelegate <TSource> next, CancellationToken cancellationToken = default) { if (IsInDesignMode) { await next(context, cancellationToken); return; } var uri = context.Current as Uri; if (uri == null || !uri.IsHttp()) { await next(context, cancellationToken); return; } var cacheKey = uri.AbsoluteUri; if (await _diskCache.IsExistAsync(cacheKey)) { context.Current = await _diskCache.GetStreamAsync(cacheKey, cancellationToken); try { await next(context, cancellationToken); } catch { _diskCache.DeleteAsync(cacheKey).Ignore(); throw; } } else { await next(context, cancellationToken); var bytes = context.HttpResponseBytes; if (bytes != null) { _diskCache.SetAsync(cacheKey, bytes, CancellationToken.None).Ignore(); } } }