从SSIS调用SSRS时部分PDF文件损坏问题求助
解决SSIS脚本任务调用SSRS生成损坏PDF的问题
我之前也碰到过SSIS脚本任务里用HttpWebRequest拉取SSRS报表存成PDF时文件损坏的情况,大概率是流读取不完整或者请求配置缺失导致的,给你几个实用的解决思路和修正后的代码:
核心问题分析与修复步骤
1. 完善请求头与身份验证
SSRS报表请求需要正确的内容类型声明,而且如果你的SSRS实例启用Windows身份验证,必须带上当前上下文的凭据,否则可能获取到权限错误的页面而非真实PDF内容:
loRequest = CType(System.Net.WebRequest.Create(url), System.Net.HttpWebRequest) ' 添加Windows身份验证凭据 loRequest.Credentials = System.Net.CredentialCache.DefaultCredentials ' 明确指定接受PDF格式 loRequest.Accept = "application/pdf" loRequest.ContentType = "application/pdf" ' 大报表建议加长超时时间,避免中途断开 loRequest.Timeout = 300000 ' 设置为5分钟超时
2. 修复流读取逻辑
你原来的代码里流读取部分不完整,只读取了一次256字节就停止了,这会导致大报表的内容被截断,直接造成PDF损坏。正确的做法是循环读取流直到返回0:
Protected Sub SaveFile(ByVal url As String, ByVal localpath As String) Dim loRequest As System.Net.HttpWebRequest Dim loResponse As System.Net.HttpWebResponse Dim loResponseStream As System.IO.Stream Dim loFileStream As System.IO.FileStream = Nothing Dim laBytes(4096) As Byte ' 用4096字节数组读取更高效 Dim liCount As Integer Try loRequest = CType(System.Net.WebRequest.Create(url), System.Net.HttpWebRequest) ' 配置请求核心参数 loRequest.Credentials = System.Net.CredentialCache.DefaultCredentials loRequest.Accept = "application/pdf" loRequest.ContentType = "application/pdf" loRequest.Timeout = 300000 loResponse = CType(loRequest.GetResponse(), System.Net.HttpWebResponse) loResponseStream = loResponse.GetResponseStream() loFileStream = New System.IO.FileStream(localpath, System.IO.FileMode.Create, System.IO.FileAccess.Write) ' 循环读取流直到结束,确保内容完整写入 liCount = loResponseStream.Read(laBytes, 0, laBytes.Length) Do While liCount > 0 loFileStream.Write(laBytes, 0, liCount) liCount = loResponseStream.Read(laBytes, 0, laBytes.Length) Loop Catch ex As Exception ' 添加错误日志便于排查,这里可以结合SSIS的日志框架 Throw New Exception("保存PDF文件时出错: " & ex.Message, ex) Finally ' 务必释放所有流资源,避免内存泄漏或文件占用 If loFileStream IsNot Nothing Then loFileStream.Close() If loResponseStream IsNot Nothing Then loResponseStream.Close() If loResponse IsNot Nothing Then loResponse.Close() End Try End Sub
3. 额外排查点
- 先直接在浏览器中访问你的SSRS报表URL,确认能正常下载完整的PDF,排除报表本身的渲染问题;
- 检查SSIS运行账户对
localpath路径是否有写入权限,权限不足可能导致文件写入不完整; - 如果是HTTPS的SSRS实例,需要确保客户端信任服务器证书,否则可能请求失败或获取到错误内容。
内容的提问来源于stack exchange,提问作者Kinchit Dalwani
相关产品推荐
相关产品推荐

