【问题标题】:ASP.net MVC - Check status requestASP.net MVC - 检查状态请求
【发布时间】:2011-02-04 03:09:58
【问题描述】:

只是想知道是否可以从另一个请求中获取请求的状态?

为了帮助提供一些上下文,我想使用 ajax 将一些文件上传到服务器。开始上传时,我想触发另一个 ajax 请求,检查文件的上传量(或者换句话说,另一个请求有多大,服务器接收请求有多远)。

我在想我可以使用 guid 或类似的东西来确保我正在检查正确请求的状态。但是我如何检查另一个请求的状态???

干杯 安东尼

【问题讨论】:

    标签: asp.net asp.net-mvc iis file-upload httpwebrequest


    【解决方案1】:

    这绝对是可能的。据我所知,在 ASP.NET MVC 中没有内置支持检查另一个请求的状态,但这并不难实现。

    public static UploadStatusHelper {
        static Dictionary<string, int> uploads = new Dictionary<string, int>();
        static object lockObj = new object();
    
        public static void SetStatus(string key, int bytesComplete) {
            lock(lockObj) {
                uploads[key] = bytesComplete;
            }
        }
    
        public static void GetStatus(string key) {
            lock(lockObj) {
                int bytesComplete = 0;
                if(uploads.TryGetValue(key, out bytesComplete) {
                    return bytesComplete;
                }
                return 0;
            }
        }
    }
    

    当你在服务器上读取了一大块上传的文件时,你会调用

    UploadStatusHelper.SetStatus(theKey, bytesRead);
    

    然后使用 Ajax,您可以定期向返回进度的操作发起 HTTP POST 请求,例如

    [HttpPost]
    public ActionResult GetProgress(string key)
        int bytesRead = UploadStatusHelper.GetStatus(key);
        return Json(new { bytesRead = bytesRead });
    }
    

    您可能希望扩展此帮助程序以存储文件的总长度并返回完成百分比,但这只是为了向您展示如何完成。

    【讨论】:

    • 当你说“当你在服务器上读取了一大块上传的文件时,你会打电话”你是说这会在行动中进行吗???如果是这种情况,据我所知,只有在收到所有数据时才会调用该操作。因此,SetStatus 调用应该放在哪里?
    • 是的,你完全正确 - 只有在收到所有数据后才会执行正常操作。可能你可以使用 AsyncController 来解决这个问题,尽管我还没有尝试过。我自己使用了一个自定义的 IHttpHandler。无论哪种方式,您都需要查找或编写一些代码来分块解析多部分表单数据并设置上传状态,然后还有所有的javascript。皮塔饼!您是否看到这个问题的一些可能的替代方案? stackoverflow.com/questions/977995/…
    【解决方案2】:

    您可能想查看implementing Asynchronous requests in ASP.NET MVC,或类似的东西。

    【讨论】:

    • 我认为这是不对的,因为上传所花费的时间不是数据到达服务器后处理数据的时间,而是将数据发送到服务器。据我所知,这发生在可以使用异步请求逻辑 ASP.NET MVC 之前。
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2018-02-22
    • 2012-02-07
    • 2019-09-19
    • 2015-11-14
    • 2016-01-15
    相关资源
    最近更新 更多