zoukankan      html  css  js  c++  java
  • stream流写到MemoryStream内存流引发得问题

    采用httphandler去中转访问认证服务器。以下代码实现得是从认证远程服务器上下载资源到本地客户端。但实际连接到远程服务器上,下载文件所花费得时间非常长。大家分析下代码?看看程序所执行得时间花费在哪里,并减少这个时间花费。我认为该程序所花费太多时间,是发生在stream流写到内存流上。谢谢。讨论讨论。

    页面上调用方法:

    <a href="/aklib.aspx?fn=文件完整路径" target="_blank">文件名</a>

    code:


    public class AutoDownload : IHttpHandler
    {

    #region IHttpHandler Members

    public bool IsReusable
    {
    get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {
    try
    {
    string fileName = SoFContext.Current.GetStringInQs("fn", string.Empty);
    string siteUrl= System.Configuration.ConfigurationManager.AppSettings["SiteUrl"].ToString();
    string user = System.Configuration.ConfigurationManager.AppSettings["FtpUser"].ToString();
    string passWord = System.Configuration.ConfigurationManager.AppSettings["FtpPassWord"].ToString();

    string filePath = string.Empty;
    filePath
    = siteUrl+ fileName;

    string file = Path.GetFileName(filePath);

    HttpContext.Current.Response.Buffer
    = true;
    HttpContext.Current.Response.Charset
    = "utf-8";
    HttpContext.Current.Response.ContentEncoding
    = Encoding.UTF8;
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ContentType
    = "application/octet-stream";
    HttpContext.Current.Response.AppendHeader(
    "Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(file, Encoding.UTF8));

    HttpWebRequest httpWebRequest;
    httpWebRequest
    = (HttpWebRequest)HttpWebRequest.Create(filePath);

    NetworkCredential credential;
    if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(passWord))
    {
    credential
    = new NetworkCredential(user, passWord);
    httpWebRequest.Credentials
    = credential;
    }

    using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
    {
    using (Stream responseStream = httpWebResponse.GetResponseStream())
    {

    byte[] arrayByte;
    byte[] buffer = new byte[4096];
    using (MemoryStream stmMemory = new MemoryStream())
    {

    int count = 0;
    do
    {
    count
    = responseStream.Read(buffer, 0, buffer.Length);
    stmMemory.Write(buffer,
    0, count);

    }
    while (count != 0);

    arrayByte
    = stmMemory.ToArray();

    HttpContext.Current.Response.AppendHeader(
    "Content-Length", arrayByte.Length.ToString());
    HttpContext.Current.Response.BinaryWrite(arrayByte);

    HttpContext.Current.Response.Flush();
    HttpContext.Current.ApplicationInstance.CompleteRequest();
    }



    }
    }
    }
    catch (Exception ex)
    {
    System.Diagnostics.Debug.Fail(ex.Message);
    System.Diagnostics.Debug.Fail(ex.StackTrace);

    }
    }

    HttpHandler有时使用并不是拥有很的性能。

    考虑流量大的问题:建议使用异步的HttpHandler(具体参考MSDN做法)

    那你做的方法:确

    你的 HttpWebRequest是同步的, 如果文件大+并发高了 结果你自己知道!

    另外你通过这种方式下载,相当于下了2次! 你首先下载了一次到服务器内存,然后再把内存的东西发给用户.

    实是拿内存进行了中转,所以花费一些时间。

     
  • 相关阅读:
    ckeditor 实现图片上传以及预览(亲测有效)
    学习OpenStack之 (4): Linux 磁盘、分区、挂载、逻辑卷管理 (Logical Volume Manager)
    学习OpenStack之 (1):安装devstack
    学习OpenStack之 (0):基础知识
    Aho-Corasick 多模式匹配算法、AC自动机详解
    标准C++中的string类的用法总结
    STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)
    linux下文件合并、分割、去重
    设计模式之观察者模式(Observable与Observer)
    访问者模式讨论篇:java的动态绑定与双分派
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1651617.html
Copyright © 2011-2022 走看看