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。