none
asp.net 结合wcf下载文件问题 RRS feed

  • 问题

  • 最近在做文件下载,其中使用到了wcf,下面是文件下载的代码,wcf仅用来获取文件流。

    但是奇怪的问题是使用wcf 获取文件流用于下载的话会出现一些下载工具不能下载的问题。

    现象:

    1、IE自身的下载器下载正常。

    2、使用世界之窗、搜狗、360等浏览器自带的下载器下载时,下载无响应,直到1分多钟后会下载页面又重新收到request,下载过程又执行一次,文件下载成功。

    另外:经过测试发现将获取文件流部分代码替换成其他方式(比如FileStream直接读取文件)获取文件流则正常。

     

     

    private void DoDownLoadFile(tab_zbb_zbwj wj)
      {
       //从文件服务下载文件流
       FileServiceWCFClient fsc = new FileServiceWCFClient();
       byte[] downbuffer = fsc.DownloadFile(wj.fileid, null);
       Response.Clear();
       Response.ClearContent();
       Response.ClearHeaders();
       Response.Buffer = false;
       Response.AddHeader("Content-Length", downbuffer.Length.ToString());
       Response.ContentType = "application/octet-stream";
       Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(wj.zbwjName, System.Text.Encoding.UTF8));
       try
       {
        try
        {
         //改成分块下载,以供一些下载工具下载
         using (MemoryStream mms = new MemoryStream(downbuffer))
         {
          long dataToRead = mms.Length;
          int length = 0;
          // 缓冲区为10k
          byte[] buffer = new Byte[10000];
          while (dataToRead > 0)
          {
           // 检查客户端是否还处于连接状态
           if (Response.IsClientConnected)
           {
            length = mms.Read(buffer, 0, 10000);
            Response.OutputStream.Write(buffer, 0, length);
            Response.Flush();
            buffer = new Byte[10000];
            dataToRead = dataToRead - length;
           }
           else
           {
            // 如果不再连接则跳出死循环
            dataToRead = -1;
           }
          }
         }
    
        }
        catch (Exception e)
        {
         AlertErrMsg = e.Message;
        }
       }
       finally
       {
        Response.End();
       }
      }
    


     

     

     


    5207

    • 已编辑 5207 2011年7月13日 2:13 修改内容
    2011年7月13日 1:43

答案

  • 谢谢回复,下载的问题已经解决了。

    当时出问题的时候现象就是使用了wcf 获取文件流,会导致无法下载的现象。

    后来更换了下载的安全验证机制,解决了这个问题。所以可能是跟我们开发的安全验证有关系。


    5207
    2011年7月18日 14:36

全部回复