You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:04:50