我已经开始使用WebRequest从给定的URL中检索文件。如果我在浏览器中点击URL,则会提示您下载该文件。我想把这个文件重定向到另一个URL。
我已经掌握了基础知识,但我不熟悉流媒体和HTTP,所以我有点迷失了。我知道下面的代码不起作用,因为写入的文件也包含所有额外的http响应,然后文件最终在另一方面损坏(在这种情况下它是一个PDF文件):
var toRequest = WebRequest.Create(destinationUrl);
toRequest.Method = "PUT";
toRequest.UseDefaultCredentials = true;
toRequest.ContentType = "application/octet-stream";
var fromRequest = WebRequest.Create(reportUrl);
fromRequest.UseDefaultCredentials = true;
fromRequest.Method = "GET";
fromRequest.ContentType = "application/octet-stream";
var buffer = new byte[10240];
int bytesRead = 0;
int totalBytesRead = 0;
Stream responseStream;
do
{
responseStream = fromRequest.GetResponse().GetResponseStream();
if (responseStream != null)
{
bytesRead = responseStream.Read(buffer, 0, buffer.Length);
logger.Info(String.Format("Read {0} bytes", bytesRead));
}
totalBytesRead += bytesRead;
} while (bytesRead > 0);
toRequest.ContentLength = totalBytesRead;
var writer = new BinaryWriter(toRequest.GetRequestStream());
writer.Write(buffer, 0, totalBytesRead);
HttpWebResponse response = (HttpWebResponse)toRequest.GetResponse();
response.Close();
if (responseStream != null) responseStream.Close();
writer.Close();
在我的测试场景中,“reportUrl”是SSRS生成的PDF文件。同样,直接在浏览器中点击此链接会导致提示将文件保存到我的计算机。我希望我的代码获取此文件并将其重定向到“destinationUrl”,这将类似于“http://testserver/folder/report.pdf”。
同样,基础工作正常,但“report.pdf”文件已损坏且无法加载,因为它当前包含额外的SSRS生成的元数据:
1 >>
endobj
7 0 obj
<< /Type /Catalog /Pages 6 0 R >>
endobj
8 0 obj
<< /Title <feff004300680061006e0067006500470075006900640065>
/Author <>
/Subject <>
/Creator (Microsoft Reporting Services 10.0.0.0)
/Producer (Microsoft Reporting Services PDF Rendering Extension 10.0.0.0)
/CreationDate (D:20120221083306-07'00')
>>
那么,WebRequest对象甚至是正确的方法吗?是否有更聪明的方式可以让我更轻松地访问该文件?
谢谢!
答案 0 :(得分:1)
使用WebClient直接下载PDF。
答案 1 :(得分:0)
好吧,好像你正在尝试发送一个可能比文件短的缓冲区:
writer.Write(buffer, 0, totalBytesRead); //totalBytesRead may be > 10240