2019-11-04 ajax轮询session阻塞

1. 需求

项目使用aspx mvc框架,前端fineui(开源) ,orm使用subsonic+T4。

缺少一个多文件上传控件,拟使用Baidu Webuploader实现。

2.设计

前端页面加载回显代码

<script>
    $(document).ready(function(){
        $.ajax({
            url: 'ZchAnnouncementExceptionHandler.ashx,
            type: 'GET',
            headers: { "Accept": "application/json" },
            contentType: 'application/json;charset=utf-8',
            data: { Action: "EchoFilelist" },
            success: function (data) {
                debugger;
                var obj = JSON.parse(data);
                var handle_status = obj.handled;
                fileList = obj.list;
                $.each(fileList, function (index, item) {
                    var obj = {};
                    obj.name = item.Src
                    obj.size = item.Fsize
                    obj.id = item.Id
                    obj.lastModifiedDate = item.Adddate
                    obj.ext = item.Ext

                    var file = new WebUploader.File(obj);
                    file.setStatus('complete');
                    uploader.addFiles(file);

                });

                // 已处置去除删除列
                if (handle_status) {
                    $(".file-upload-table tr :nth-child(3)").remove();
                }
                $("#loading-img").remove();
            },
            error: function (data) {
                alert("获取文件列表失败!");
            }
        })
    })
</script>

后台ashx代码

    /// <summary>
    /// ZchAnnouncementExceptionHandler 的摘要说明
    /// </summary>
    public class ZchAnnouncementExceptionHandler 
        : ZchBaseHandler
        , IRequiresSessionState 
    {
        /// <summary>
        /// 回显列表 附件
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public string EchoFilelist(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            int jid = IntQueryParam(context, "jid");
            int vid = IntQueryParam(context, "vid");

            try
            {
                var result = UploadfileBll.GetInstence()
                    .Find(x => x.Joinid == jid && x.Uploadconfig_id == 
                    vid);

                if (result == null || result.Count <= 0)
                {
                    return JsonHelper.ToJson(new AjaxData(
                        true, null, "上传文件列表为空!"));
                }

                AjaxData data = new AjaxData(true, null, "获取上传文件 
                    列表成功!");

                // 处置状态
                data.handled = GetHandleStatus(jid);

                foreach (var model in result)
                {
                    data.list.Add(new UploadData(model));
                }

                return JsonHelper.ToJson(data);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
   }

3. 问题

回显请求如中途取消,fineui回发请求响应缓慢。

 4. 解决

这是由于ashx读写session造成阻塞,分析下载逻辑发现只需读取session内容。

将引用接口IRequireSessionState改为IReadOnlySessionState。

猜你喜欢

转载自www.cnblogs.com/hexx/p/11790570.html