首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

MVC Controller处理文件下传,ashx获取下传信息。必须等Controller存储完后才能读取。求解

2012-12-17 
MVC Controller处理文件上传,ashx获取上传信息。必须等Controller存储完后才能读取。。求解我在一个MVC的cont

MVC Controller处理文件上传,ashx获取上传信息。必须等Controller存储完后才能读取。。求解
我在一个MVC的controller中处理文件上传,其中进度信息保存在session中,然后通过AJAX请求一个ashx来读取session进度。但是AJAX的请求发到服务端后,必须要等controller的文件保存完毕才能读取session的值。此时session里记录的文件进度已经是100%了。AJAX返回的数据一下全部都是100%,没能达到监听进度的木的,求达人详解。下面是相关代码

 controller处理文件部分


            FileProgress progress = new FileProgress(); 
            int length = ulf.FileLength;
            progress.TotalSize = length;
            byte[] FileArray = new Byte[length]; 
            int index = 0; 
            byte[] b = new byte[5000];
            int getByteSize = ulf.FileData.Read(b, 0, b.Length);
            while (getByteSize > 0)
            {
                Array.Copy(b, 0, FileArray, index, getByteSize);
                index += getByteSize;
                Thread.Sleep(100);
                progress.CurrSize = index;
                HttpContext.Current.Session[file_key] = progress; 
                getByteSize = ulf.FileData.Read(b, 0, b.Length);
            }

            FileAttachment attach = new FileAttachment();
            attach.FieldName = ulf.ConditionField;
            attach.FileData = FileArray;
            attach.FileLength = length;
            attach.FileName = ulf.FileName;
            attach.FormId = new Guid(ulf.FormId);
            attach.InstanceId = new Guid(ulf.InstanceId);

ashx读取session部分

public class FileUploadProgressHandler : IHttpHandler,IRequiresSessionState 
    {
        Double Percentage = 0.00;
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/json";

            FileProgress progress = (FileProgress)context.Session[context.Request["sessionId"]];//request. .Cache[guid] as DownloadingFileInfo;



                
                if (progress!=null&&progress.TotalSize > 0)
                {
                    Percentage = progress.CurrSize / progress.TotalSize;
                }
                String result = "{'sucress':'true','data':'" + Percentage.ToString() + "'}";
                context.Response.Write(result);
             
             
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }


Ajax请求部分

 startUpload: function (queue) {
        var me = this;
        var sessionId = new Date().getTime();
        this.params.sessionId = sessionId;
        me.task = window.setInterval(function () {
            me.getUploadProgress({}, me.progressUrl, { sessionId: sessionId });
        }, 10);
        for (var i = 0; i < queue.items.length; i++) {
            var form = queue.items[i];
            form.getForm().submit({
                url: this.url,
                params: this.params,
                isUpload: true
            });


        }

    },
    getUploadProgress: function (progressBar, url, params) {
        var me = this;

        Ext.Ajax.request({
            url: url,
            params: params,
            method: 'post',


            success: function (response) {
                var rs = Ext.decode(response.responseText);
                console.log(rs.data)
                if (rs.data == 1) {
                    window.clearInterval(me.task);
                }
            }
        });

    }


[最优解释]
引用:
我在一个MVC的controller中处理文件上传,其中进度信息保存在session中,然后通过AJAX请求一个ashx来读取session进度。但是AJAX的请求发到服务端后,必须要等controller的文件保存完毕才能读取session的值。此时session里记录的文件进度已经是100%了。AJAX返回的数据一下全部都是100%,没能达到监听进度的木的,求达人详解……

你换个设计思路好不好, 在这里用session有问题。你在controller的接收文件的action, 就把session给锁住了

根据微软的文档:
但是,如果这两个并发请求是针对同一会话的(通过使用相同的 SessionID 值),则第一个请求将获得对会话信息的独占访问权。第二个请求将只在第一个请求完成之后执行
http://msdn.microsoft.com/zh-cn/library/ms178581(v=vs.100).aspx

另外上传文件的进度可以在客户端作,下面是一个演示,jquery的一个插件,你看看源码:
http://jquery.malsup.com/form/progress.html
[其他解释]
http://www.codeproject.com/Tips/402588/Using-AJAX-asynchronously-with-progress-bar-and-st
[其他解释]
昨晚也猜到有可能是这个问题,后来用cache 解决了此问题,但仍然感谢两位
[其他解释]
昨晚也猜到有可能是这个问题,后来用cache 解决了此问题,但仍然感谢两位
[其他解释]
昨晚也猜到有可能是这个问题,后来用cache 解决了此问题,但仍然感谢两位

热点排行