0

我试图获取长时间运行的状态进度。它在 FF:)、Opera 和 IE:? 中运行良好,但在 Chrome 中?!它失败了:它永远不会进入通用处理程序中的 ProcessRequest。拜托,你能建议我做错了什么吗?

默认.aspx:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="AspNetProgressBar._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" type="text/javascript"></script>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <asp:Button runat="server" Text="Run" OnClick="button_Click" OnClientClick="button_start()"  />
...

<script type="text/javascript">
    function button_start() {
        setInterval(function () {
            $.ajax({
                url: 'StatusHandler.ashx',
                data: { statusKeyId: '<%= ViewState["key"] %>' },
                type: 'post',
                dataType: 'json',
                success: function (json) {
                    ... process response
                },
                error: function () {

                }
            });
        }, 1000);
    }
</script>

...

默认.aspx.cs

....
protected void button_Click(object sender, EventArgs e)
    {
        System.Threading.Thread.Sleep(2000);
        for (int i = 0; i < 10; ++i)
        {
            System.Threading.Thread.Sleep(500);
            // TODO: update progress status
        }
        // lblStatus.Text = "Done";
    }

状态处理程序.ashx.cs:

public class StatusHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "application/json";

        string statusKeyId = context.Request.Params["statusKeyId"];
        if (statusKeyId != null)
        {
                System.Web.Script.Serialization.JavaScriptSerializer s = new System.Web.Script.Serialization.JavaScriptSerializer(GetStatusInfo(statusKeyId ));
                string output = s.Serialize(info);
                context.Response.Write(output);
                return;
        }
        context.Response.Write("{test: \"empty\"}");
    }
4

1 回答 1

0

问题不是:为什么这在 Chrome 中不起作用,但为什么在 IE 和 Firefox 中起作用。

当点击按钮时,浏览器会向服务器发送一个正常的http请求来替换整个页面。我猜想在那一刻是否在页面上执行 javascript 的行为是未定义的,或者至少在不同浏览器之间有所不同,正如您所注意到的那样。

更好的方法是使用异步请求 (Ajax) 调用您的服务器,以便页面在浏览器中保持活动状态。然后,当您的 StatusHandler 回答时,您的长时间运行的进程已准备好,您可以将浏览器重定向到一个 url,它可以从服务器获取结果页面。

于 2012-10-31T15:41:36.067 回答