浏览器不是以 PDF 格式显示来自 SSRS 服务器的报告,而是显示来自 Web 服务器的原始响应
Instead of displaying report from SSRS server in PDF, the browser is displaying the raw response from the web server
这是我用来以 PDF 格式显示来自 SSRS 服务器的报告的代码。
var reportServerUrl = new Uri(string.Format("{0}?{1}{2}&rs:aCommand=Render&rs:Format=pdf",
ConfigurationManager.AppSettings("ReportServerURL"),
ConfigurationManager.AppSettings("ReportFolder"), ItemPath));
var wcli = new WebClient();
wcli.Credentials = CustomReportCredentials.WebClientCredentials;
var fileBuffer = wcli.DownloadData(reportServerUrl);
if (fileBuffer != null)
{
Response.ContentType = "application/pdf";
Response.AddHeader("content-length", fileBuffer.Length.ToString());
Response.BinaryWrite(fileBuffer);
}
大部分时间都有效。但是,有时当我单击 link 时,我得到的不是 PDF 格式的报告,而是一些奇怪的结果,具体取决于浏览器。在 CHROME 中,我正在获取页面的源代码。在 IE 中,我得到原始响应 + 一些奇怪的字符(见图)。然后页面超时。
老实说,我不知道为什么会这样。
感谢您的帮助。
你看到的是一个原始的二进制 HTTP 响应,包括 headers 和解释为 HTML 的负载(这就是构成那些奇怪字符的原因)。我认为您在这里缺少的是在设置 headers 后调用 Response.Clear()
:
if (fileBuffer != null)
{
Response.ContentType = "application/pdf";
Response.AddHeader("content-length", fileBuffer.Length.ToString());
Response.Clear();
Response.BinaryWrite(fileBuffer);
}
如果不这样做,将保留网络服务器的默认值 headers。
话虽如此,我认为您真的不需要设置有效负载的内容长度。请参阅 Response.Flush()
.
的示例
这是我用来以 PDF 格式显示来自 SSRS 服务器的报告的代码。
var reportServerUrl = new Uri(string.Format("{0}?{1}{2}&rs:aCommand=Render&rs:Format=pdf",
ConfigurationManager.AppSettings("ReportServerURL"),
ConfigurationManager.AppSettings("ReportFolder"), ItemPath));
var wcli = new WebClient();
wcli.Credentials = CustomReportCredentials.WebClientCredentials;
var fileBuffer = wcli.DownloadData(reportServerUrl);
if (fileBuffer != null)
{
Response.ContentType = "application/pdf";
Response.AddHeader("content-length", fileBuffer.Length.ToString());
Response.BinaryWrite(fileBuffer);
}
大部分时间都有效。但是,有时当我单击 link 时,我得到的不是 PDF 格式的报告,而是一些奇怪的结果,具体取决于浏览器。在 CHROME 中,我正在获取页面的源代码。在 IE 中,我得到原始响应 + 一些奇怪的字符(见图)。然后页面超时。
老实说,我不知道为什么会这样。
感谢您的帮助。
你看到的是一个原始的二进制 HTTP 响应,包括 headers 和解释为 HTML 的负载(这就是构成那些奇怪字符的原因)。我认为您在这里缺少的是在设置 headers 后调用 Response.Clear()
:
if (fileBuffer != null)
{
Response.ContentType = "application/pdf";
Response.AddHeader("content-length", fileBuffer.Length.ToString());
Response.Clear();
Response.BinaryWrite(fileBuffer);
}
如果不这样做,将保留网络服务器的默认值 headers。
话虽如此,我认为您真的不需要设置有效负载的内容长度。请参阅 Response.Flush()
.