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 内のページの処理が完了した後にのみ 1 回だけです。

私は自分がやろうとしていることをできるはずだと読み続けています...どんな助けも大歓迎です。これは私を夢中にさせています。投稿の長さについてお詫び申し上げます。

4

1 に答える 1

0

asp.net セッション状態は、同じセッションへの同時要求を特別な方法で処理します。

同じセッションに対して (同じ SessionID 値を使用して) 2 つの同時要求が行われた場合、最初の要求はセッション情報への排他的アクセスを取得します。2 番目の要求は、最初の要求が終了した後にのみ実行されます。

上記はMSDN の記事からのものです。

別の方法で同時実行を処理する独自のSessionStateProviderを作成することもできます。

于 2013-03-07T17:07:47.713 に答える