Blazor调用SSRS报表重复获取旧数据,如何解决?
Blazor调用SSRS报表重复返回旧数据的解决建议
问题描述
Blazor应用调用SSRS报表时,每次执行SsrsReportService.GetReportPdfAsync方法都返回相同的旧数据;仅重启应用后的首次调用能获取正确数据,后续无论传入何种参数,返回结果均无更新。
解决建议
1. 禁用HTTP请求缓存
默认情况下,HttpClient会缓存GET请求的响应,这是导致重复返回旧数据的核心原因。需要在请求头中添加明确的禁用缓存指令:
var request = new HttpRequestMessage(HttpMethod.Get, serverReportPath); request.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/pdf")); // 添加禁用缓存的请求头 request.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue { NoCache = true, NoStore = true, MustRevalidate = true }; request.Headers.Pragma.Add(new System.Net.Http.Headers.NameValueHeaderValue("no-cache"));
2. 修正IfModifiedSince参数
原代码中设置IfModifiedSince = DateTime.Now可能无法正确触发SSRS返回新数据,建议将其设置为过去的时间,强制服务器返回最新内容:
request.Headers.IfModifiedSince = DateTimeOffset.UtcNow.AddYears(-1);
3. 全局配置HttpClient禁用缓存
在服务注册时,给HttpClient添加全局的缓存禁用配置,避免每个请求重复设置:
services.AddHttpClient("SsrsReportServiceClient") .ConfigureHttpClient(client => { var baseRptSvr = mmAppBase.AppSettingsMgr.GetSetting("BaseRptSrv"); client.BaseAddress = new Uri(baseRptSvr); // 全局禁用缓存 client.DefaultRequestHeaders.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue { NoCache = true, NoStore = true }; }).ConfigurePrimaryHttpMessageHandler(() => { return new HttpClientHandler { UseDefaultCredentials = true, AllowAutoRedirect = false, // 配置Handler级别的缓存策略 CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore) }; });
4. 确认请求URL的唯一性
检查传入的reportPath参数是否包含动态变化的内容(如时间戳、查询参数等)。如果每次请求的URL完全一致,即使禁用缓存,服务器也可能返回相同结果。确保每次调用时,reportPath能反映不同的报表参数需求。
修改后的完整方法示例
public async Task<byte[]> GetReportPdfAsync(string reportPath) { var _http = _httpClientFactory.CreateClient("SsrsReportServiceClient"); try { var rptSvrAddr = mmAppBase.AppSettingsMgr.GetSetting("ReportServer"); var serverReportPath = $"{rptSvrAddr}{reportPath}&rs:Format=PDF"; var request = new HttpRequestMessage(HttpMethod.Get, serverReportPath); request.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/pdf")); // 禁用缓存 request.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue { NoCache = true, NoStore = true, MustRevalidate = true }; request.Headers.Pragma.Add(new System.Net.Http.Headers.NameValueHeaderValue("no-cache")); // 强制服务器返回最新数据 request.Headers.IfModifiedSince = DateTimeOffset.UtcNow.AddYears(-1); var response = await _http.SendAsync(request); if (!response.IsSuccessStatusCode) throw new Exception($"Failed to get report: {response.StatusCode}"); return await response.Content.ReadAsByteArrayAsync(); } catch (Exception) { throw; } finally { _http.Dispose(); } }
内容的提问来源于stack exchange,提问作者MarioSalento
相关产品推荐
相关产品推荐

