【发布时间】:2013-12-13 22:11:56
【问题描述】:
这里有问题,再次认为我接近解决方案,但它正在躲避我。
从 WCF 服务获取文件流后,我尝试从我们的 ASP.NET 网站下载 Excel 文件。这似乎工作正常,但我可能会走错路。
使用代码中的断点,我可以看到文件到达方法并“流式传输”到浏览器,但是它无法下载(当小图标出现在角落或会出现提示,具体取决于浏览器)。
我已尝试修改此代码 http://www.codeproject.com/Articles/166763/WCF-Streaming-Upload-Download-Files-Over-HTTP 以接受 .xls 文件。
这是我的 FileTransfer.cs 和 IFileTransfer.cs WCF 类。 文件传输.cs
public RemoteFileData DownloadFile(DownloadRequest request)
{
RemoteFileData result = new RemoteFileData();
try
{
string filePath = System.IO.Path.Combine(@"C:\Files", request.FileName);
System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
// does file exist?
if (!fileInfo.Exists)
throw new System.IO.FileNotFoundException("File not found", request.FileName);
// open the stream
System.IO.FileStream stream = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
// return result over the stream
result.FileName = request.FileName;
result.Length = fileInfo.Length;
result.FileByteStream = stream;
}
catch (Exception ex)
{
}
return result;
}
IFileTransfer.cs
[ServiceContract]
public interface IFileTransfer
{
[OperationContract]
RemoteFileData DownloadFile(DownloadRequest request);
}
[MessageContract]
public class DownloadRequest
{
[MessageBodyMember]
public string FileName;
}
[MessageContract]
public class RemoteFileData : IDisposable
{
[MessageHeader(MustUnderstand = true)]
public string FileName;
[MessageHeader(MustUnderstand = true)]
public long Length;
[MessageBodyMember(Order = 1)]
public System.IO.Stream FileByteStream;
public void Dispose()
{
if (FileByteStream != null)
{
FileByteStream.Close();
FileByteStream = null;
}
}
}
这里是链接按钮方法/事件。
protected void LnkBtn_genPAFFile_Click(object sender, EventArgs e)
{
try
{
GSIISFileTransferService.IFileTransfer tClient = new GSIISFileTransferService.FileTransferClient();
GSIISFileTransferService.DownloadRequest requestData = new GSIISFileTransferService.DownloadRequest();
GSIISFileTransferService.RemoteFileData fileInfo = new GSIISFileTransferService.RemoteFileData();
requestData.FileName = "form.xls";
fileInfo = tClient.DownloadFile(requestData);
Response.BufferOutput = false;
byte[] buffer = new byte[6500];
int bytesRead = 0;
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + requestData.FileName);
bytesRead = fileInfo.FileByteStream.Read(buffer, 0, buffer.Length);
while (bytesRead > 0)
{
if (Response.IsClientConnected)
{
Response.OutputStream.Write(buffer, 0, bytesRead);
// flush data to HTML
Response.Flush();
buffer = new byte[6500];
bytesRead = fileInfo.FileByteStream.Read(buffer, 0, buffer.Length);
}
else
{
bytesRead = -1;
}
}
}
catch (Exception ex)
{
System.Web.HttpContext.Current.Response.Write("Error : " + ex.Message);
}
finally
{
Response.Flush();
Response.Close();
Response.End();
System.Web.HttpContext.Current.Response.Close();
}
}
【问题讨论】: