2

2 页。Uploader.aspx 和 Uploadee.aspx。

Uploadee.aspx 位于 Uploader.aspx 上的 iframe 中。

这是 Uploader.aspx 的标记:

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Uploader.aspx.cs" Inherits="Uploader" EnableEventValidation="false" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
    function doupload()
    {
        document.getElementById('spFN').innerHTML = 'Document upload in progress.';
        window.frames[0].document.forms[0].submit();

        intervalID = window.setInterval(function ()
        {
            PageMethods.GetUploadStatus(function (result)
            {
                if (result)
                {
                    alert(result.fileNumber);
                    document.getElementById('spFN').innerHTML = 'Uploading file ' + result.fileNumber;
                }
            });
        }, 500);
    }  
</script>
</head>
<body>

    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"></asp:ScriptManager>
    <div>
    <span onclick="doupload();">Try it</span> <span id="spFN"></span>
    <iframe id="uploadFrame" frameborder="0" height="400" width="800" scrolling="yes" src="Uploadee.aspx"></iframe>
    </div>
    </form>
</body>
</html>

我正在尝试从 iframe 中的页面读取会话变量的值。这是iframe中页面后面的页面中的代码(uploadee.aspx)。

    public partial class Uploadee : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            for (int i = 0; i < 3; i++)
            {
                Session["FN"] = i.ToString();
                Thread.Sleep(1000);
            }
        }
    }
}

所以,我在一个循环中将会话变量 - Session [“FN”] - 每次迭代增加1。

在包含 iframe 的页面后面的代码中,我有这个:

 #region Web Methods
[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static object GetUploadStatus()
{
    string fileNumber = HttpContext.Current.Session["FN"].ToString();
    return new
    {
        fileNumber = fileNumber
    };

}
#endregion

所以,过程是:我点击包含页面上的“试用”跨度 - Uploader.aspx - 这会调用 javascript 函数 doupload()

这会在 iframe 中的页面上提交表单。当此表单提交时,将运行增加 Session["FN"] 变量值的循环。同时,PageMethods.GetUploadStatus 应该每 500 毫秒查询一次 Session["FN"] 的值。

但是,PageMethods.GetUploadStatus 中唯一一次显示警报是在循环的所有迭代之后。它可以检索 Session["FN"] 的值 - 但只有一次且仅在 iframe 中的页面完成处理之后。

我一直在阅读,我应该能够做我想做的事情......非常感谢任何帮助。这让我发疯了。为帖子的长度道歉。

4

1 回答 1

0

asp.net 会话状态以特殊方式处理对同一会话的并发请求:

如果对同一会话发出两个并发请求(通过使用相同的 SessionID 值),则第一个请求获得对会话信息的独占访问权。第二个请求仅在第一个请求完成后执行。

以上来自MSDN 文章

您可以创建自己的SessionStateProvider以不同的方式处理并发。

于 2013-03-07T17:07:47.713 回答