1

JQuery と ASP.NET を使用して単純な ajax チャットを作成しようとしています。私のコードは次のように機能します:

  1. ページが読み込まれると、messages.aspx ページへの要求で 'chatbox' div が更新されます。これにより、データベースからの新しいメッセージの取得が処理され、setTimeout() で自動更新が開始されます。
  2. ユーザーが送信ボタンをクリックすると、messages.aspx page_load コード内のデータベースにメッセージが追加されます。

タイムアウトが始まるとすぐにスタック オーバーフロー エラーが発生しますが、何が原因なのかわかりません。それはキャッシングでしょうか?もしかしたら、messages.aspx のコードが 5 秒以内に実行を完了できないのでしょうか? どんな助けでも大歓迎です!

また、SQL インジェクション攻撃については心配していませんでしたが、単純なコードで動作させようとしていただけでした。

これが私のコードです:

クライアント側

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!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>Untitled Page</title>
    <script src="jquery.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            refreshChat();
            $("#btnSend").click(function () {
                addMessage();
            });
            return false;
        });

        function refreshChat() {
            $.get("messages.aspx", function (data) {
                $("#chatbox").empty();
                $("#chatbox").prepend(data);
            });
            setTimeout(refreshChat(), 5000);
        }

        function addMessage() {
            $.get("messages.aspx", { usr: $("#usr").val(), msg: $("#msg").val() });
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <div id="input">
            username: <input type="text" name="usr" id="usr" /><br />
            message:<br />
            <textarea id="msg" name="msg" rows="5" cols="30"></textarea><br /><br />
            <input type="button" id="btnSend" name="btnSend" value="Send" />
        </div>
        <div id="chatbox"></div>
    </form>
</body>
</html>

サーバ側

using System;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections;
using System.IO;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class messages : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {     
        SqlConnection conn = 
            new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=F:\\Chatter\\App_Data\\messages.mdf;Integrated Security=True;User Instance=True");
        conn.Open();

        string sql;
        SqlCommand comm;

        if (Request["usr"] != null)
        {
            string user = Request["usr"].ToString();
            string message = Request["msg"].ToString();
            sql = "insert into messages (usr, msg, [date]) values ('"
                + user + "', '" + message + "', '" + DateTime.Now + "')";
            comm = new SqlCommand(sql, conn);
            comm.ExecuteNonQuery();
        }

        sql = "select top 5 usr, msg from messages order by [date] desc";
        comm = new SqlCommand(sql, conn);
        SqlDataReader dr = comm.ExecuteReader();

        while (dr.Read())
        {
            Response.Write(dr["usr"].ToString() + ": <br/>" + dr["msg"] + "<br/><br/>");
        }
        dr.Close();

        conn.Close();
    }
}
4

2 に答える 2

6

JavaScript の refreshChat 関数が再帰的に自分自身を呼び出しています。コードを次のように変更します。

function refreshChat() {
    $.get("messages.aspx", function (data) {
        $("#chatbox").empty();
        $("#chatbox").prepend(data);
    });
    setTimeout(refreshChat, 5000);
}
于 2009-04-07T16:43:11.973 に答える
3

setTimeout 内の関数呼び出しを引用符で囲む必要があります。そうしないと、すぐに評価され、無限再帰とスタック オーバーフローが発生します。

setTimeout("refreshChat()", 5000);
于 2009-04-07T16:41:11.367 に答える